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

标签 c++ arrays pointers inheritance

我正在尝试制作一个程序,该程序创建指向对象(包括继承的对象)的指针的数组。
我得到的错误是在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/

    相关文章:

    c++ - 为指向成员模板参数的指针推导额外模板参数类型的紧凑方法

    c++ - 继承函数的重载解决方案

    javascript - 如何映射两个数组来创建对象?

    java - 我应该如何将 json 值返回到另一个方法中

    C 所有值都随指针改变

    c++ - 如何生成 C++ 动态对象名称?

    c++ - 为什么不能使用嵌套的初始化程序列表初始化std::array <std::pair <int,int>,3>,但是std::vector <std::pair <int,int >>可以初始化?

    python - 从两个单独数组中的文件读取数据

    c - 我如何操纵位从0x00到0x34,以便创建由这些值表示的卡座

    c++ - 我如何优化这个 dijkstra 结构代码?