Мне нужен вектор, который может хранить классы (B
), которые наследуют от A
Вектор находится в классе, который управляет всем потоком приложения и содержит векторный Test
.
Класс А
class A {
public:
virtual void test() {
cout << "Class A" << endl;
}
};
Класс B
class B : public A {
public:
virtual void test() {
cout << "Class B" << endl;
}
};
Класс тестирования
class Test {
private:
vector<A*> v;
public:
void input() {
A a;
B b;
A *a2 = &b;
for (int i = 0; i < 10; i++) {
if (i%2 > 0) {
v.push_back(&a);
} else {
v.push_back(a2);
}
}
}
void output() {
for (unsigned int i = 0; i < v.size(); i++) {
v[i]->test();
}
}
};
главный
int main () {
Test t;
t.input();
t.output();
return 0;
}
Эта программа добавляет классы BABABABABA к вектору и выводит "класс A" или "класс B", которые относятся к классу.
Если я помещаю код output()
внутри метода input()
, программа работает нормально. Но, как и здесь, программа компилируется без проблем, но при выполнении ошибки при нарушении доступа. Это упрощает большую проблему. Я предпочитаю не иметь весь код метода output()
методе input()
.
Из того, что я вижу, от метода к методу, указатели вектора повреждены и неправильно указывают. Зачем?
Вы работаете над объектами, которые создаются в стеке в методе input
которые уничтожаются после возврата метода.
Даже если вы храните адрес этих объектов в векторе и пытаетесь получить к ним доступ в методе output
ваша программа вылетает из строя, потому что эти объекты больше не существуют.
Вместо этого создайте объекты в main
или создайте их динамически в куче.
Эти определения
A a;
B b;
определить локальные переменные ввода функции, которые будут уничтожены после выхода из функции. Указатели стали недействительными. Вы должны динамически выделять объекты, которые будут добавлены к вектору.