c++ - 指向对象和继承对象的指针数组
问题描述
我正在尝试制作一个程序来创建指向对象的指针数组,包括继承的对象。我得到的错误位于 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);
解决方案
缺少此工作所需的构造函数:
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));
推荐阅读
- cocoa - Cocoa Pods Podfile 保存在哪里?
- python - 如何在熊猫中沿时间序列获取真实东部数据的均值/中位数?
- javascript - 如何根据降序对对象的对象进行排序?
- java - 如何将表名作为变量传递给 Java/Spring?
- python - 在查询 PyMySQL 中使用 WHERE
- node.js - 如何修复“dyld:未加载库:/usr/lib/libc++.1.dylib 引用自:/usr/local/bin/node 原因:找不到图像 Trace/BPT 陷阱”
- reactjs - 从表单将值传递回父级
- javascript - 让 Jest toBeCalledWith 将 `undefined` 视为没有参数
- sql - SQL Server:LAG() OVER (ORDER BY Y) 对重复的 Y 值应用相同的结果
- php - Silverstripe 3:在 cms 编辑页面中重定向