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

     2023-02-21     102

关键词:

【中文标题】指向对象和继承对象的指针数组【英文标题】: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];

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

【讨论】:

继承和指针数组

...类的类,并且我想将新类放入一个数组中。该数组仅保存指向其中一个继承类的指针。该数组会溢出还是指针数组仅“包含”从该数组所针对的类继承的类的一部分?例子:我有一个名为“screens”的类,它有3个指针数组来保存... 查看详情

指向继承对象的指针

】指向继承对象的指针【英文标题】:Pointertoanobjectininheritance【发布时间】:2016-01-1917:08:59【问题描述】:这里我没有得到正确的输出,这里我使用了继承概念,但我不知道如何使用指针类型的对象调用方法。请有人给我一些解... 查看详情

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

】指向基点的指针可以指向派生对象的数组吗?【英文标题】:Canapointertobasepointtoanarrayofderivedobjects?【发布时间】:2011-08-2519:36:15【问题描述】:我今天去面试,被问到这个有趣的问题。除了内存泄漏和没有虚拟dtor,为什么这... 查看详情

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

】如何计算指向不同向量数组中特定对象的指针的出现次数【英文标题】:Howtocountoccurencesofapointertoaspecificobjectindifferentvectorarrays【发布时间】:2017-01-3109:07:52【问题描述】:我已经定义了一个类node。一个element类由四个指向不同... 查看详情

重温javascript

...。每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应的,另一... 查看详情

使用多个指向它的指针来管理对象

】使用多个指向它的指针来管理对象【英文标题】:Managinganobjectwithmultiplepointerstoit【发布时间】:2019-02-1410:55:56【问题描述】:假设我有两个抽象类,A1和A2。A1有一个名为foo()的函数,A2有一个名为bar()的函数。我为这些基类创... 查看详情

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

】指向对象的指针数组的动态分配【英文标题】:DynamicAllocationofanArrayofPointerstoObjects【发布时间】:2009-11-2218:21:26【问题描述】:这个问题是用C++编写的。我正在尝试动态分配指向对象的指针数组。我知道我可以使用矢量容器,... 查看详情

指向对象开头的指针 (C++)

】指向对象开头的指针(C++)【英文标题】:Pointertothestartofanobject(C++)【发布时间】:2010-08-1515:39:44【问题描述】:我需要一种方法来获取指向C++中对象开头的指针。此对象在模板中使用,因此它可以是任何类型(多态或非多态)... 查看详情

如果继承类型受到保护,我可以使基类的指针指向派生对象吗? [复制]

】如果继承类型受到保护,我可以使基类的指针指向派生对象吗?[复制]【英文标题】:canImakeapointerofbaseclasstopointtoaderivedobjectifinheritancetypeisprotected?[duplicate]【发布时间】:2014-11-2117:12:39【问题描述】:如果我有一个从基类继承... 查看详情

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

】交换对象数组是不是会影响指向它的指针【英文标题】:Doestheswappinganarrayofobjectaroundaffectsthepointersthatpointingatit交换对象数组是否会影响指向它的指针【发布时间】:2021-07-0807:03:13【问题描述】:在交换或移动对象数组时,如... 查看详情

对指向 Objective-C 对象的指针数组进行 qsort

】对指向Objective-C对象的指针数组进行qsort【英文标题】:qsortonanarrayofpointerstoObjective-Cobjects【发布时间】:2011-02-0314:32:01【问题描述】:我有一个指向Objective-C对象的指针数组。这些对象有一个与之关联的排序键。我正在尝试使... 查看详情

js原型链和继承的理解

...传统oop有些不同,语法较高级语法糖封装。This为指针。指向this作用域的调用者1.原型继承链顶端为Object。Js函数是对象2.当读取对象中的属性时,先去实例本身中搜索,如搜索不到则去指向的原型中搜索1.原型的存在意义在于实... 查看详情

使用具有指向派生类对象的指针的基类指针数组调用派生类方法

】使用具有指向派生类对象的指针的基类指针数组调用派生类方法【英文标题】:Callingderivedclassmethodsusingarrayofbaseclasspointerswhichhaspointerstoderivedclassobjects【发布时间】:2016-12-1714:23:10【问题描述】:我有一个基类Player和两个派生... 查看详情

原型链

...:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么,假如我们让原型对象等于另一个类型的实例,结果会怎么样呢?显然,此时的原型对象将包含一... 查看详情

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

】删除指针数组而不删除内存中的指向对象?【英文标题】:Deleteapointerarraywithoutdeletingthepointedobjectsinmemory?【发布时间】:2011-11-2721:30:32【问题描述】:我想知道是否有一种方法可以在不触及内存中指向的对象的情况下删除指针... 查看详情

原型链

...每个构造函数都有一个原型对象,原型对象对象都有一个指向构造函数的指针,//而实例都包含一个指向原型对象的内部指针functionSuperType(){this.property=true;}SuperType.prototype.getSuperV 查看详情

在 C++ 中使用指向数组中对象的指针会更好吗?

】在C++中使用指向数组中对象的指针会更好吗?【英文标题】:IsitbettertousepointerstoobjectsinanarrayinC++?【发布时间】:2016-03-2616:28:27【问题描述】:我正在涉足C++并试图将我的头脑围绕在指针的事情上。创建对象数组时,创建对象... 查看详情

js继承方式

...系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。原型链实现继 查看详情