我正在尝试创建一个程序,该程序创建指向对象(包括继承的对象)的指针的数组。
我得到的错误是在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);
答案 0 :(得分: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),
maxPassengers{mp}
{}
//...
}
您还有其他一些问题:
您在基类中有一个非virtual
析构函数。当您通过非delete
基类指针virtual
对象时,将仅调用基类析构函数。要解决此问题,请将其添加到sClass
:
virtual ~sClass() = default;
cSClass::getInfo()
的两个定义。只能在类定义中声明函数,而将成员函数的定义保留在.cpp
文件中。
由于没有delete
编辑new
,因此内存泄漏。为了避免该问题,最好使用智能指针,当对象超出范围时将使用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));
答案 1 :(得分:0)
您的代码中有两个基本错误!
首先,您为getInfo
的{{1}}成员函数提供了两个定义。如果要保留第二个(体外)定义,则需要删除(体内)声明的 definition 部分。因此,替换:
cSClass
与此:
// 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
随时要求进一步的澄清和/或解释。