指针传染媒介在同一个类的不同的方法

时间:2013-12-30 18:21:22

标签: c++ pointers vector

我需要一个可以存储从B继承的类(A)的向量。向量位于管理应用程序所有流的类中,并包含向量Test

A类

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;
}

该程序将 B A B A B A B A B A 类添加到向量中,并输出“A类”或“B类”,取决于什么类。

如果我将output()的代码放在input()方法中,程序运行正常。但正如它在这里,程序编译没有问题,但它在执行时给出了访问冲突错误。 这是一个更大问题的简化。我不想在output()方法中使用input()方法的所有代码。

从我看到的,从方法到方法,向量的指针已被破坏,并且没有正确指向。为什么呢?

2 个答案:

答案 0 :(得分:4)

您正在对input方法中在堆栈上创建的对象进行操作,这些对象在返回方法后会被销毁。
即使您将这些对象的地址存储在向量中并尝试使用output方法访问它们,程序也会崩溃,因为这些对象不再存在。

而是在main中创建对象,或在堆上动态创建它们。

答案 1 :(得分:0)

这些定义

A a;
B b;

定义函数输入的局部变量,在退出函数后将被销毁。指针变得无效。您应该动态分配将添加到向量中的对象。