如何添加/删除对向量的类指针的引用

时间:2014-09-28 00:48:16

标签: c++ pointers vector reference delete-operator

类设置有点奇怪,但它就是这样。当我尝试删除指向以下类的类实例的指针时,我遇到了问题:

class Foo {
    Foo() { x = 5; }
    ~Foo() {}
    int x;
}

class Bar : public Foo {
    Bar() {}
    ~Bar() {}
    void Test() { std::cout << "Hello World! " << x << std::endl; }
}

class Base {
    Base() {}
    ~Base() {}

    vector<Foo*> vec;
    void Add(Foo* const &f) { vec.push_back(f); }
    void Delete() { 
        delete vec[0];
        vec[0] = NULL;
        vec.clear();
    }
}

class Derived : public Base {
    Derived() { b = new Bar(); }
    ~Derived() {}
    AddBar() { Add(b); }
    Test() { b->Test(); }

    Bar* b;
}

基本上,DerivedBar pointer在某个时刻动态分配,然后传递到std::vector of Foo pointersBar从中导出vectorDerived维护在vector继承的类中,vector用于执行vector中所有元素的一大堆不同操作,但是现在我只显示一个条目。

问题在于我尝试从int main() { Derived d; d.Test(); // works fine, outputs: "Hello World! 5" d.AddFoo(); d.Test(); // works fine, outputs: "Hello World! 5" d.Delete(); d.Test(); // doesn't work fine, outputs: "Hellow World! -17891602 } 删除元素,如下所示:

Bar*

释放内存,看看整数现在是垃圾数据,但d仍然认为它NULL存在,即使删除它并将其设置为Base.Delete()中的Bar*。 / p>

有没有办法d中的本地NULL被释放/删除并设置为Derived,而无需从{d.Test()执行此操作1}}实例本身(即程序在尝试执行最终{{1}}类时崩溃)

从技术上讲,我可以照原样做到这一点,但感觉凌乱而效率低下。

此外,如果有一个不错的答案并没有诉诸智能或独特的指针,我个人更喜欢这个,我不会讨论为什么。

如果这是唯一的解决方案,那我就全力以赴。

编辑当我第一次写它时,弄乱了Derived :: b,立即修复

0 个答案:

没有答案