Вектор указателей на разные методы одного и того же класса

0

Мне нужен вектор, который может хранить классы (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().

Из того, что я вижу, от метода к методу, указатели вектора повреждены и неправильно указывают. Зачем?

Теги:
pointers
vector

2 ответа

4
Лучший ответ

Вы работаете над объектами, которые создаются в стеке в методе input которые уничтожаются после возврата метода.
Даже если вы храните адрес этих объектов в векторе и пытаетесь получить к ним доступ в методе output ваша программа вылетает из строя, потому что эти объекты больше не существуют.

Вместо этого создайте объекты в main или создайте их динамически в куче.

  • 0
    Спасибо, это сработало отлично. Я не слишком привык работать с указателями.
0

Эти определения

A a;
B b;

определить локальные переменные ввода функции, которые будут уничтожены после выхода из функции. Указатели стали недействительными. Вы должны динамически выделять объекты, которые будут добавлены к вектору.

Ещё вопросы

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