类层次结构中所有对象的静态向量 shared_ptr

Static vector of shared_ptr's for all the objects of a class hierachy

本文关键字:向量 静态 shared ptr 对象 层次结构      更新时间:2023-10-16

我有一个小类层次结构,我希望所有对象都有一个指向该类层次结构中任何其他对象的指针。所以我决定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的未定义引用.我需要以某种方式预初始化向量吗?..

如果我弄错了,除了创建外部向量之外,还有什么方法可以实现这个想法吗?

static数据成员不仅必须在类定义中声明,而且还必须在一个转换单元中定义(如果使用 ODR)。

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

另外,看看你的基类的std::enable_shared_from_this,如果它们真的都是shared_ptr管理的。

不知道为什么你需要这样的结构,到目前为止,我的印象是你只需要一组(不是 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;