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

Posted

技术标签:

【中文标题】指向对象和继承对象的指针数组【英文标题】:Array of pointers to objects and inherited objects 【发布时间】:2020-04-15 17:06:20 【问题描述】:

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

【问题讨论】:

什么错误?将它们粘贴到问题中。 new sClass(...) - 你在这里传递的实际参数是什么?这很重要,因为错误显然是在抱怨构造函数参数。 您是在构造函数中直接输入... 吗?还是应该重视?最大的问题是您的超类没有默认构造函数,但您还是尝试在子类构造函数中调用它。 1) 这是Ship(string n = "s1", int yb = 2000) ...sClass的构造函数吗? (post edition upd ok) 2) 没有3参数cSClass构造函数,只有1参数:cSClass(int mp = 2000) ...,也传递另外两个参数。 在帖子底部编辑,还有 @TedLyngmo 这是一个错误,Ship 也应该是 sClass 【参考方案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),
        maxPassengersmp
    
    //...

你还有一些其他的问题:

您在基类中有一个非virtual 析构函数。当您通过非virtual 基类指针delete 您的对象时,只会调用基类析构函数。要解决此问题,请将其添加到 sClass:

virtual ~sClass() = default;

cSClass::getInfo() 的两个定义。满足于只在类定义中声明函数,而在.cpp文件中保留成员函数的定义。

内存泄漏,因为你没有delete 你已经newed。为了避免这个问题,最好使用智能指针,当对象超出范围时,它会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));

【讨论】:

【参考方案2】:

您的代码中有两个基本错误!

首先,您为cSClassgetInfo 成员函数提供了两个 定义。如果要保留第二个(体外)定义,则需要删除(体内)声明的 definition 部分。所以,替换:

    // 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 创建的对象释放内存:

    delete SArray[0];
    delete SArray[1];
    delete SArray[2];
    delete SArray[3];

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

【讨论】:

以上是关于指向对象和继承对象的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

在c++编程中,怎么定义对象数组的指针?

交换对象数组是不是会影响指向它的指针

如何计算指向不同向量数组中特定对象的指针的出现次数

指向基点的指针可以指向派生对象的数组吗?

指向对象的指针数组的动态分配

删除指针数组而不删除内存中的指向对象?