4

这是我第一次在 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:在这种情况下,智能指针似乎没有用。所以我现在要使用行指针

4

1 回答 1

3

根据您的描述,听起来Node实例具有明确的所有者(Scene)。如果是这样,shared_ptr不一定是最好的解决方案;std::unique_ptr,甚至原始指针(在 中带有必要的删除~Scene)可能更合适。或者也许是 Boost 的指针向量。相同的考虑适用于ComponentNode。并且父指针Component看起来像是严格用于导航的,所以原始指针是最合适的。

于 2013-01-24T09:59:07.523 回答