指向对象和继承对象的指针数组

时间:2020-04-15 17:06:20

标签: c++ arrays pointers inheritance

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

2 个答案:

答案 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

随时要求进一步的澄清和/或解释。