智能指针设计问题 Boost Smart pointers

4
这是我第一次接触C++中的智能指针,我有一些理解上的问题。我想设计一种基于组件的OpenGL框架。
因此,我有一个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:在这种情况下,似乎智能指针无用。因此,现在我使用原始指针。

1
无论如何都要避免使用shared_ptr来处理循环引用!在我看来,Component中的owner应该是一个weak_ptr - πάντα ῥεῖ
1个回答

3

根据您的描述,Node 实例似乎有一个明确的所有者 (Scene)。如果是这样,shared_ptr 不一定是最佳解决方案;std::unique_ptr、甚至是原始指针 (在 ~Scene 中进行必要的删除) 可能更加合适。或许可以考虑使用 Boost 的指针向量。同样的问题也适用于 ComponentNode。而且 Component 中的父指针看起来仅用于导航,因此原始指针可能是最适合的。


1
使用行指针不会使智能指针失去作用吗? - Penman
1
@peyman 如果使用智能指针的目的只是为了使用智能指针,那么是的。否则,我不明白这个问题。使用智能指针的目的是解决特定的问题。如果问题不存在,就没有理由使用智能指针。当指针用于导航时,问题不存在(或者如果存在,通常的智能指针无法解决它,因此需要其他东西)。 - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接