Как использовать методы дочернего класса через итератор, который пробегается по списку базового класса?
Я писал игру, где у меня возникла одна проблема. С ней справится я не смог, поэтому обращаюсь сюда. Дабы вам было понятнее, я написал отдельный код, где тоже возникает эта ошибка (её код, кстати -1073741819).
Вопрос заключается вот в чём: Как использовать методы дочернего класса через итератор, который пробегается по списку базового класса?
#include <iostream>
#include <list>
using namespace std;
class A {
public:
virtual void func() = 0;
};
class B : public A {
public:
int value;
B(int value) {
this->value = value;
}
void func() override {
cout << value << endl;
}
};
list<A*> aclass;
list<A*>::iterator IT;
void create(int value) {
aclass.push_back(&B(value));
}
int main() {
for (int l = 0; l < 10; l++) {
create(l);
}
for (IT = aclass.begin(); IT != aclass.end(); IT++) {
(*IT)->func();
}
}
Ответы (1 шт):
Вы почти всё сделали правильно. Проблема есть лишь в том, на что указал @HolyBlackCat – нужно заменить &B(value) на new B(value) и всё заработает.
Вкратце о том, почему: когда Вы делаете просто B(value), создаётся временный объект класса B. Если передать в качестве аргумента сам этот объект, он будет скопирован и сохранён в списке. Но Вы передаёте только лишь указатель. Указатель на временный объект. А временному объекту "всё равно", был на него создан указатель или нет, его дело маленькое, он просуществовал до конца строки и, если не был скопирован, канул в лету. Следовательно, полученный указатель указывает на объект, которого уже нет. Чтобы создать "постоянный" объект и взять на него указатель, используется оператор new.