Невозможно распечатать вектор указателей - PullRequest
0 голосов
/ 07 октября 2019

У нас есть несколько классов, класс A, у которых есть конструктор, который выглядит следующим образом:

A::A(int num, bool boods, double diablo, std::vector<ClassB* > &c) {
    createobj();
    setNum(num);
    setboods(boods);
    setDiablo(diablo);
    c= this->c;  //Where c, is just a vector of pointer objects of class B
}

void A::createobj() {
    E e("e", 59, 0, 100);  //Where E is a derived class inherited from class B
    B *e = &e;
    c.push_back(e); 
}

//Then over at main:

main() {
    std::vector<ClassB* > c;
    A a(100, true, 1.21, c);

    std::cout << c.size();  //prints out 1 as expected...

    for(auto i : c){
        std::cout << i->getName() << std::endl; //instead of printing "e"
                                                //I get this from the console 
                                                //�
                                                //Segmentation Fault
    }
}

Я работаю над этим более 12 часов, любая помощь очень ценится, и я буду танцевать у васwedding.

c vector - это закрытый вектор указателей, который был объявлен в классе .h и содержит только объекты ClassB *.

1 Ответ

1 голос
/ 07 октября 2019

Это проблема:

void A::createobj(){
    E e("e", 59, 0, 100);  
    B *e = &e;   // <-- Is this your real code?  Anyway, the next line is bad also
    c.push_back(e);  // <-- The e is a local variable
}

Вы сохраняете указатели на локальную переменную e, поэтому, когда возвращается createobj, e больше не существует.

Одно из решений состоит в том, чтобы динамически распределять ваши объекты, а затем вам нужно правильно управлять временем их жизни, освобождая память где-то в вашем коде, выполняя вызовы delete:

void A::createobj(){
    E* e = new E("e", 59, 0, 100);  
    c.push_back(e);  // <-- ok 
}
...