这是我第一次接触C++中的智能指针,我有一些理解上的问题。我想设计一种基于组件的OpenGL框架。
因此,我有一个Scene类,它创建节点(并将其存储在自己内部),并将其作为shared_ptr返回。Node类具有组件列表,这些组件在Node类中创建,并再次作为shared_ptr返回,但是这些组件还需要引用它们的所有者(Node),而且Node本身应该将其指针传递给其组件。
现在:在其组件中指向Node的指针应该是什么?是shared_ptr还是weak_ptr?如何在Node内部传递它(Node没有引用其存储在Scene中的shared_ptr)?
//! EDIT 1
请帮助我在这里做出最好的设计。
// 编辑1: 更加清晰明了!
场景是节点的唯一所有者。它创建和销毁它们。 每个节点都拥有其所有组件。它创建和销毁它们。 并且组件需要对它们的所有者有一个引用,它们将与其他对象共享该引用(通过返回 Get 方法中的所有者)。
-> 场景拥有节点,节点拥有组件。
-> 场景共享节点(按名称返回节点对象)
-> 节点共享其所有组件(按类名返回组件)
-> 组件共享其所有者(返回所有者引用)
如何在不共享所有权的情况下共享对象?weak_ptr??
编辑2:在这种情况下,似乎智能指针无用。因此,现在我使用原始指针。
因此,我有一个Scene类,它创建节点(并将其存储在自己内部),并将其作为shared_ptr返回。Node类具有组件列表,这些组件在Node类中创建,并再次作为shared_ptr返回,但是这些组件还需要引用它们的所有者(Node),而且Node本身应该将其指针传递给其组件。
现在:在其组件中指向Node的指针应该是什么?是shared_ptr还是weak_ptr?如何在Node内部传递它(Node没有引用其存储在Scene中的shared_ptr)?
//! EDIT 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;
}
请帮助我在这里做出最好的设计。
// 编辑1: 更加清晰明了!
场景是节点的唯一所有者。它创建和销毁它们。 每个节点都拥有其所有组件。它创建和销毁它们。 并且组件需要对它们的所有者有一个引用,它们将与其他对象共享该引用(通过返回 Get 方法中的所有者)。
-> 场景拥有节点,节点拥有组件。
-> 场景共享节点(按名称返回节点对象)
-> 节点共享其所有组件(按类名返回组件)
-> 组件共享其所有者(返回所有者引用)
如何在不共享所有权的情况下共享对象?weak_ptr??
编辑2:在这种情况下,似乎智能指针无用。因此,现在我使用原始指针。
shared_ptr
来处理循环引用!在我看来,Component
中的owner
应该是一个weak_ptr
。 - πάντα ῥεῖ