gpt4 book ai didi

c++ - 指向对象和继承对象的指针数组

转载 作者:行者123 更新时间:2023-12-01 14:52:55 27 4
gpt4 key购买 nike

我正在尝试制作一个程序,该程序创建指向对象(包括继承的对象)的指针的数组。
我得到的错误是在cSClass的第一个括号内(例如SArray[2] = new cSClass(...);(所有代码底部的最后一行)。错误说:“没有构造函数cSClass::cSClass的实例与参数列表匹配”。

谢谢

所有代码如下:

父类(super class) header 的代码为:

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();
};

父类(super class)的主要类:
#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)一样。例:
    #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);

    注意:如果您想要动态数量的catch指针,请使用sClass:
    #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));
  • 关于c++ - 指向对象和继承对象的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234505/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com