Как создавать объекты вне функций с полиморфизмом?

0

Я хочу использовать полиморфизм и создавать объекты вне основной или любой другой функции, чтобы функции не зависели от типа объектов, которые у меня есть. Мой код выглядит следующим образом:

Основной класс:

class load{   //Main class
protected:
    static load **L;
    static int n, n1;
public:
    load(){};
    virtual float getpower()=0;
    static int getn();
    static load ** getL();
};

load **load::L;
int load::n; 
int load::n1;

int load::getn(){
    return n;
}

load** load::getL(){
    return L;
}

Класс child:

class load1:public load{ 
private:
    float power;
public:
    load1();
    load1(int s);
    void createUnits1();
    float getpower();
}l1(0);               //Object creation

load1::load1(int s){
    createUnits1();
}

void load1::createUnits1(){
    cout<<"Give the number of type 1 objects: "<<endl;
    cin>>n1;
    for (int i=0;i<n1;i++){
        load1 temp;         //Run default constructor
    }
}

load1::load1(){
    cout<<"Give the power of the device: "<<endl;
    cin>>power;
    n++;
    if (n==1){
        L=(load **)malloc(n*sizeof(load *));
    }
    else {
        L=(load **)realloc(L,n*sizeof(load *));
    }
    L[n-1]=this;
}

float load1::getpower(){
    return power;
}

Функция вычисления:

float get_total_P(load **l, int num){
    float tot_power=0;
    for(int i=0;i<num;i++){
        tot_power+=l[i]->getpower();
    }
    return tot_power;
}

Моя основная функция:

int main() {
    load **l;
    int num;
    num=load::getn();
    l=load::getL();
    float total_P=get_total_P(l, num);
    cout<<total_P;
    return 0;
}

Верхний код вызывает ошибку сегментации, но я не вижу причины. Ошибка сегментации на линии

tot_power+=l[i]->getpower();

Поэтому я предполагаю, что мой способ создания объектов ошибочен. Есть лучший способ сделать это?

Теги:
class
polymorphism
inheritance

1 ответ

0

Причина для Segfault, что l не указывает ни на что действительное!

В main() вы инициализируете l с load::getL(). Но эта функция возвращает только load::L который имеет тот же тип и был определен как статический в вашем классе нагрузки, но никогда не был инициализирован.

Вы закодировали в своем производном классе load1 некоторый код инициализации для L, но он никогда не вызывается в main().

У вашего кода также есть некоторые серьезные проблемы с дизайном:

  • Не рекомендуется использовать malloc() и realloc() в коде C++. Если вы создаете объект в C++, используйте new. Если вам нужен какой-то динамический массив, используйте векторы.

  • Вы можете получить L и, следовательно, l инициализироваться, если вы создали некоторые объекты load1 до вызова getL(). Но из-за вашего realloc я тогда рискнул бы указывать на устаревший, таким образом, недопустимый адрес, если бы вы создали любой другой объект load1 до вызова get_total().

  • Это плохая практика и ужасный дизайн, чтобы запросить ввод пользователя в конструкторе. Конструктор предназначен для создания объекта с параметрами, которые вы ему даете, когда вы его вызываете. Представьте, что пользователь предоставит неверный параметр? Пользователь будет запрашиваться для ввода всякий раз, когда объект load1 будет сконструирован. Даже для временных переменных, даже не говоря о эффекте, когда вы будете писать load1 a [10];

  • 1
    Спасибо за советы! Я создал новые объекты, используя новые, и это сработало!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню