C++ 共享ptr'的静态向量;s表示类层次结构的所有对象
我有一个小的类层次结构,我希望所有的对象都有一个指向这个类层次结构中任何其他对象的指针。所以我决定使用C++ 共享ptr'的静态向量;s表示类层次结构的所有对象,c++,pointers,inheritance,shared-ptr,static-members,C++,Pointers,Inheritance,Shared Ptr,Static Members,我有一个小的类层次结构,我希望所有的对象都有一个指向这个类层次结构中任何其他对象的指针。所以我决定使用共享的静态向量,这是个好主意。更具体地说,我有一个类a,它有一个受保护的字段: static std::vector< std::shared_ptr<A> > vector_of_objects; 因此,这个想法的要点是:当创建从A继承的任何类的对象时,它将调用基类构造函数,并将指向自身的指针指向静态向量 坦率地说,我对这是否可能感到困惑。无论如何,在construc
共享的静态向量,这是个好主意。更具体地说,我有一个类a
,它有一个受保护的
字段:
static std::vector< std::shared_ptr<A> > vector_of_objects;
因此,这个想法的要点是:当创建从A
继承的任何类的对象时,它将调用基类构造函数,并将指向自身的指针指向静态向量
坦率地说,我对这是否可能感到困惑。无论如何,在constructor中的这一行,我得到了一个链接错误-未定义对对象的a::vector\u的引用。我是否需要以某种方式预先初始化向量
万一我弄错了,除了创建一个外部向量,还有什么方法可以实现这个想法吗?不确定为什么需要这样一个结构,到目前为止,我的印象是您只需要一组对象(不是std::set)。对于链接错误,您应该如下定义静态成员:
std::vector<std::shared_ptr<A>> A::vector_of_objects;
std::vector A::vector_of_对象;
否则,您只是声明了它,而不是定义了它
使用完整代码段更新:
#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;
#包括
#包括
甲级{
公众:
静态std::向量allObjects;
(){
所有对象。向后放置(此);
}
};
std::vector A::AllObject;
不确定为什么需要这样的结构,到目前为止,我的印象是您只需要一组对象(而不是std::set)。对于链接错误,您应该如下定义静态成员:
std::vector<std::shared_ptr<A>> A::vector_of_objects;
std::vector A::vector_of_对象;
否则,您只是声明了它,而不是定义了它
使用完整代码段更新:
#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;
#包括
#包括
甲级{
公众:
静态std::向量allObjects;
(){
所有对象。向后放置(此);
}
};
std::vector A::AllObject;
不确定为什么需要这样的结构,到目前为止,我的印象是您只需要一组对象(而不是std::set)。对于链接错误,您应该如下定义静态成员:
std::vector<std::shared_ptr<A>> A::vector_of_objects;
std::vector A::vector_of_对象;
否则,您只是声明了它,而不是定义了它
使用完整代码段更新:
#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;
#包括
#包括
甲级{
公众:
静态std::向量allObjects;
(){
所有对象。向后放置(此);
}
};
std::vector A::AllObject;
不确定为什么需要这样的结构,到目前为止,我的印象是您只需要一组对象(而不是std::set)。对于链接错误,您应该如下定义静态成员:
std::vector<std::shared_ptr<A>> A::vector_of_objects;
std::vector A::vector_of_对象;
否则,您只是声明了它,而不是定义了它
使用完整代码段更新:
#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;
#包括
#包括
甲级{
公众:
静态std::向量allObjects;
(){
所有对象。向后放置(此);
}
};
std::vector A::AllObject;
A静态
数据成员不仅必须在类定义中声明,而且如果使用ODR,还必须在一个翻译单元中定义
作为旁注,静态向量应该只存储弱ptr
s,除非您真的想让它们永远保持活力(在这种情况下,原始指针就足够了)
另外,请查看您的基类的std::enable_shared_from_this
,如果它们确实都是shared_ptr
管理的。a静态
数据成员不仅必须在类定义中声明,而且还必须在使用ODR的情况下在一个翻译单元中定义
作为旁注,静态向量应该只存储弱ptr
s,除非您真的想让它们永远保持活力(在这种情况下,原始指针就足够了)
另外,请查看您的基类的std::enable_shared_from_this
,如果它们确实都是shared_ptr
管理的。a静态
数据成员不仅必须在类定义中声明,而且还必须在使用ODR的情况下在一个翻译单元中定义
作为旁注,静态向量应该只存储弱ptr
s,除非您真的想让它们永远保持活力(在这种情况下,原始指针就足够了)
另外,请查看您的基类的std::enable_shared_from_this
,如果它们确实都是shared_ptr
管理的。a静态
数据成员不仅必须在类定义中声明,而且还必须在使用ODR的情况下在一个翻译单元中定义
作为旁注,静态向量应该只存储弱ptr
s,除非您真的想让它们永远保持活力(在这种情况下,原始指针就足够了)
另外,看看您的基类的std::enable_shared_from_this
,如果它们真的都是shared\u ptr
-管理的。向量是全局变量还是a的类成员变量?向量是类a
的静态成员。如果它是共享指针的向量,那么你看到的是大量悬空引用(当一个对象离开堆栈时)或者,这些对象都将在程序的生命周期内生存,因为它们的共享指针将持续很久。向量是全局变量还是类成员变量?向量是类的静态成员a
。如果它是共享指针的向量,那么您将看到大量悬空引用(当对象从堆栈中卸下时)或者,这些对象都将在程序的生命周期内生存,因为它们的共享指针将持续很久。向量是全局变量还是类成员变量?向量是类的静态成员a
。如果它是共享指针的向量,那么您将看到大量悬空引用