第一次使用智能指针,我正确地做到了吗?

时间:2015-08-21 14:29:02

标签: c++ shared-ptr

我有两节课。创建资源的资源,然后发送到另一个类,该类存储它以供程序的不同部分访问。我所做的是:

typedef std::shared_ptr<Object> ObjectPtr;

ObjectPtr CreatorClass::Create()
{
    ObjectPtr(new Object);
    // ...
    return ObjectPtr;
}

void StorageClass::Store(ObjectPtr obj)
{
    myVector.push_back(obj);
}

ObjectPtr StorageClass::Get(int index)
{
    return myVector[index];
}

我的问题是:

  1. 我使用shared_ptr是否正确,还是应该使用别的东西?
  2. 我应该按值ObjectPtr向商店功能和Get功能传递吗?

2 个答案:

答案 0 :(得分:0)

  

我使用shared_ptr是否正确,还是应该使用别的东西?

如果您需要共享所有权,那么您是正确的。否则你错了。

  

我是否应该通过值将ObjectPtr传递给Store函数

是。虽然你可以仍然.push_back(std::move(obj))以避免不必要的副本。

  

来自Get功能?

取决于您是否想要

  • 修改向量中的原始shared_ptr,然后通过非const引用返回
  • 只是观察它,然后通过const引用返回
  • 以上都不是,即获得你自己的副本,然后按价值返回。

答案 1 :(得分:0)

嗯,一般来说,你的效率并不高。我看到代码存在多个问题,几乎接近反模式。

  1. 无所不在的创作者。我的天哪,我讨厌他们。有什么意义? 在你的例子中'创造者'?为什么不能通过创建对象 用户直接?
  2. 存储功能。它有两个问题。首先,除了将一个元素放入向量,再加上姐妹get之外,它什么都没做 简单地提取。鉴于此,应将这两个函数发送给 遇见他们的创造者(双关语)。相反,myVector应该是 暴露给类用户。否则,您严重限制用户 经验(例如,他们怎么会知道他们是否可以打电话 得到给定的指数?他们不知道矢量的大小!)。避免 吸气剂和二传手。
  3. Store的第二个问题 - 如果我们想象Store不仅仅是简单地将东西推送到vector,那么它的存在是合理的, 它按值接受共享指针。这意味着,你是原子的 递增柜台。性能哭泣。传递共享指针 参考减少影响。更好的是,不要使用共享 ponters。在我见过的99%的案例中,这种用法是不合理的。