这是我第一次在 C++ 中体验智能指针,我有一些理解问题。我想设计某种基于组件的 OpenGL 框架。
所以我有一个场景类,它创建节点(并为自己存储)并将其作为 shared_ptr 返回。Node 类有一个组件列表,这些组件在 Node 类中创建并再次作为 shared_ptr 返回,但是这些组件还需要对其所有者(节点)的引用,并且节点本身应将其指针传递给其组件。
现在:指向其组件中的节点的指针,它应该是什么?一个 shared_ptr 或一个 weak_ptr。以及如何在节点本身中传递它(节点没有引用其存储在场景中的 shared_ptr )
//! 编辑 1
class Scene
{
vector<shared_ptr<Node>> nodes;
public:
weak_ptr<Node> NewNode();
}
class Node
{
vector<shared_ptr<Component>> components;
public:
weak_ptr<Component> AddComponent();
weak_ptr<Component> GetComponent(String classname);
vecotr<weak_ptr<Component>> GetComponents(String classname);
}
class Component
{
weak_ptr<Node> owner;
Component(weak_ptr<Node> owner_refernce);
public:
// component stuff
weak_ptr<Node> GetOwner();
friend class Node;
}
请帮助我在这里做出最好的设计。
// EDIT1:更清楚!
场景是节点的唯一所有者。它创造并摧毁它们。每个节点都拥有它的所有组件。它创造并摧毁它们。并且组件需要对其所有者的引用,它们将与其他对象共享(通过在 Get 方法中返回所有者)。
-> 场景拥有节点,节点拥有组件。
-> 场景共享节点(按名称返回节点对象)
-> 节点共享它的所有组件(按类名返回组件)
-> 组件共享它们的所有者(返回所有者参考)
如何在不共享所有权的情况下共享对象?弱点??
编辑 2:在这种情况下,智能指针似乎没有用。所以我现在要使用行指针