shared_ptrs的静态向量,用于类层次结构的所有对象

时间:2014-12-12 22:41:26

标签: c++ pointers inheritance shared-ptr static-members

我有一个小类层次结构,我希望所有对象都有一个指向该类层次结构中任何其他对象的指针。所以我决定static vector shared_ptr一个好主意。更具体地说,我有一个Aprotected字段:

static std::vector< std::shared_ptr<A> > vector_of_objects;

它在构造函数中也有这一行来填充向量:

vector_of_objects.emplace_back( this );

因此,这个想法的要点是:当创建从A继承的任何类的对象时,它将调用基类构造函数并将指向自身的指针放到静态向量中。

坦率地说,我很困惑这是否可能。无论如何,在构造函数的这一行我得到一个链接错误 - 未定义引用A::vector_of_objects。我是否需要以某种方式预先初始化矢量?..

如果我弄错了,有没有办法实现这个想法,除了创建一个外部向量?

2 个答案:

答案 0 :(得分:2)

static数据成员不仅必须在类定义中声明,而且如果使用ODR,也必须在一个翻译单元中定义。

作为旁注,你的静态向量应该只存储weak_ptr,除非你真的想让它们永远保持活着(在这种情况下,原始指针就足够了)。

另外,如果他们真的全部都是std::enable_shared_from_this - 管理,请查看shared_ptr您的基类。

答案 1 :(得分:1)

不确定为什么你需要这样的结构,到目前为止我的印象是你只需要一个set(而不是std :: set)对象。至于链接错误,您应该像这样定义静态成员:

std::vector<std::shared_ptr<A>> A::vector_of_objects;

否则你只是声明了它,没有定义。

使用完整代码段进行更新:

#include <vector>
#include <memory>

class A {
    public:
    static std::vector<std::shared_ptr<A>> allObjects;

    A() {
        allObjects.emplace_back(this);
    }
};

std::vector<std::shared_ptr<A>> A::allObjects;