Массив указателей на объекты и унаследованные объекты - PullRequest
2 голосов
/ 15 апреля 2020

Я пытаюсь создать программу, которая создает массив указателей на объекты, включая унаследованные объекты. Ошибка, которую я получаю, находится в первой скобке (из 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 ]

1 голос
/ 15 апреля 2020

Отсутствует конструктор, необходимый для этого:

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

    Примечание. Если вместо этого вам нужно динамическое c количество 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));
    
0 голосов
/ 15 апреля 2020

В вашем коде есть две фундаментальные ошибки!

Во-первых, вы предоставили два определения для функции-члена getInfo cSClass. Если вы хотите сохранить второе (вне тела) определение, то вам нужно удалить часть 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)

Тогда вызовы, которые вы делаете своим конструкторам, не могут иметь ... в списке аргументов (хотя я не уверен, что вы пытаетесь достичь с этим). Просто предоставьте пустые списки аргументов:

    SArray[0] = new sClass();
    SArray[1] = new sClass();
    SArray[2] = new cSClass();
    SArray[3] = new cSClass();

или, поскольку аргументов нет, вы можете вызвать конструктор 'default', полностью опустив списки аргументов:

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

Не стесняйтесь просить дальнейших разъяснений и / или объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...