首页 > 解决方案 > 指向对象和继承对象的指针数组

问题描述

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

标签: c++arrayspointersinheritance

解决方案


缺少此工作所需的构造函数:

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

推荐阅读