【问题标题】:Boost Smart pointers design issueBoost 智能指针设计问题
【发布时间】:2013-01-24 09:24:12
【问题描述】:

这是我第一次在 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 方法中返回所有者)。

-> 场景拥有节点,节点拥有组件。

-> 场景共享节点(按名称返回节点对象)

-> 节点共享其所有组件(按类名返回组件)

-> 组件共享它们的所有者(返回所有者参考)

如何在不共享所有权的情况下共享对象? weak_ptr ??

编辑 2:在这种情况下,智能指针似乎没有用。所以我现在要使用行指针

【问题讨论】:

  • 在任何情况下都避免通过shared_ptr 进行循环引用!恕我直言,Component 中的 owner 应该是 weak_ptr

标签: c++ class boost shared-ptr


【解决方案1】:

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

【讨论】:

  • 不会使用行指针,违背了使用智能指针的目的吗?
  • @peyman 如果使用智能指针的目的只是为了使用智能指针,是的。否则,我不明白这个问题。使用智能指针的目的是或应该是解决特定问题。如果问题不存在,则没有理由使用智能指针。当指针用于导航时,问题不存在(或者如果存在,通常的智能指针并不能解决它,所以你需要别的东西)。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多