指向对象和继承对象的指针数组
Posted
技术标签:
【中文标题】指向对象和继承对象的指针数组【英文标题】:Array of pointers to objects and inherited objects 【发布时间】:2020-04-15 17:06:20 【问题描述】:我正在尝试制作一个程序来创建指向对象的指针数组,包括继承的对象。
我得到的错误在第一个括号( cSClass 例如SArray[2] = new cSClass(...);
(所有代码底部的最后一行)。错误说“没有构造函数实例 cSClass::cSClass 与参数列表匹配”
谢谢
全部代码如下:
超类的头部代码为:
class sClass;
class sClass
protected:
std::string name;
int yearBuilt;
public:
// Constructor
sClass(string n = "s1", int yb = 2000)
name = n;
yearBuilt = yb;
// Mutator functions
void setName(string);
void setYearBuilt(int);
// Accessor functions
string getName()
return name;
int getYearBuilt()
return yearBuilt;
// Functions
void getInfo();
;
超类的主类:
#include "sClass.h"
using namespace std;
// Mutators
void sClass::setName(string n)
name = n;
void sClass::setYearBuilt(int yb)
yearBuilt = yb;
// Print function
void sClass::getInfo()
cout << "Name: " << name << endl;
cout << "Year Built: " << yearBuilt << endl;
子类头代码:
#include "sClass.h"
class cSClass : public sClass
protected:
int maxPassengers;
public:
// Constructor
cSClass(int mp = 2000) : sClass()
maxPassengers = mp;
// Mutator functions
void setMaxPassengers(int);
// Accessor functions
int getMaxPassengers()
return maxPassengers;
// Functions
void getInfo()
;
子类的代码: #include "cSClass.h"
// Mutators
void cSClass::setMaxPassengers(int mp)
maxPassengers = mp;
// Print function
void cSClass::getInfo()
cout << "Name: " << name << endl;
cout << "Maximum Passengers: " << maxPassengers << endl;
最后,这是我在尝试填充数组时遇到错误的主程序代码: #include "sClass.h" #include "cSClass.h"
int main()
sClass *SArray[6];
SArray[0] = new sClass(...);
SArray[1] = new sClass(...);
SArray[2] = new cSClass(...);
SArray[3] = new cSClass(...);
编辑:错误在顶部,我传递的参数是
SArray[2] = new cSClass("RMS Queen Mary 2", 2003, 2700);
【问题讨论】:
什么错误?将它们粘贴到问题中。new sClass(...)
- 你在这里传递的实际参数是什么?这很重要,因为错误显然是在抱怨构造函数参数。
您是在构造函数中直接输入...
吗?还是应该重视?最大的问题是您的超类没有默认构造函数,但您还是尝试在子类构造函数中调用它。
1) 这是Ship(string n = "s1", int yb = 2000) ...
sClass
的构造函数吗? (post edition upd ok) 2) 没有3参数cSClass
构造函数,只有1参数:cSClass(int mp = 2000) ...
,也传递另外两个参数。
在帖子底部编辑,还有 @TedLyngmo 这是一个错误,Ship 也应该是 sClass
【参考方案1】:
缺少此工作所需的构造函数:
SArray[2] = new cSClass("RMS Queen Mary 2", 2003, 2700);
可能是这样的
class cSClass : public sClass
cSClass(const std::string& name, int yb, int mp) :
sClass(name, yb),
maxPassengersmp
//...
你还有一些其他的问题:
您在基类中有一个非virtual
析构函数。当您通过非virtual
基类指针delete
您的对象时,只会调用基类析构函数。要解决此问题,请将其添加到 sClass
:
virtual ~sClass() = default;
cSClass::getInfo()
的两个定义。满足于只在类定义中声明函数,而在.cpp
文件中保留成员函数的定义。
内存泄漏,因为你没有delete
你已经new
ed。为了避免这个问题,最好使用智能指针,当对象超出范围时,它会delete
,就像抛出异常时一样(你catch
)。示例:
#include <memory>
//...
std::unique_ptr<sClass> SArray[6]; // or std::array<std::unique_ptr<sClass>, 6> sArray;
SArray[2] = std::make_unique<sClass>();
SArray[2] = std::make_unique<cSClass>("RMS Queen Mary 2", 2003, 2700);
注意:如果您想要动态数量的sClass
指针,请使用std::vector
:
#include <vector>
//...
std::vector<std::unique_ptr<sClass>> SArray;
SArray.push_back(std::make_unique<sClass>());
SArray.push_back(std::make_unique<sClass>());
SArray.push_back(std::make_unique<cSClass>("RMS Queen Mary 2", 2003, 2700));
SArray.push_back(std::make_unique<cSClass>("RMS Queen Mary 2", 2003, 2700));
【讨论】:
【参考方案2】:您的代码中有两个基本错误!
首先,您为cSClass
的getInfo
成员函数提供了两个 定义。如果要保留第二个(体外)定义,则需要删除(体内)声明的 definition 部分。所以,替换:
// Functions
void getInfo() /// Note: adding the provides a function DEFINITION
用这个:
// Functions
void getInfo(); // No body provided, so it's JUST a declaration (defined elsewhere)
然后,您对构造函数的调用不能在参数列表中包含...
(尽管我不确定您要通过此实现什么目标)。只需提供 empty 参数列表:
SArray[0] = new sClass();
SArray[1] = new sClass();
SArray[2] = new cSClass();
SArray[3] = new cSClass();
或者,由于没有参数,您可以通过完全省略参数列表来调用“默认”构造函数:
SArray[0] = new sClass;
SArray[1] = new sClass;
SArray[2] = new cSClass;
SArray[3] = new cSClass;
此外,为了完整起见,请记住在完成后为您使用 new
创建的对象释放内存:
delete SArray[0];
delete SArray[1];
delete SArray[2];
delete SArray[3];
请随时要求进一步澄清和/或解释。
【讨论】:
以上是关于指向对象和继承对象的指针数组的主要内容,如果未能解决你的问题,请参考以下文章