我有一个小类层次结构,我希望所有对象都有一个指向该类层次结构中任何其他对象的指针。所以我决定static vector
shared_ptr
一个好主意。更具体地说,我有一个A
类protected
字段:
static std::vector< std::shared_ptr<A> > vector_of_objects;
它在构造函数中也有这一行来填充向量:
vector_of_objects.emplace_back( this );
因此,这个想法的要点是:当创建从A
继承的任何类的对象时,它将调用基类构造函数并将指向自身的指针放到静态向量中。
A::vector_of_objects
。我是否需要以某种方式预先初始化矢量?..
如果我弄错了,有没有办法实现这个想法,除了创建一个外部向量?
答案 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;