【发布时间】:2017-06-30 23:06:16
【问题描述】:
我需要创建几个Worker 类,这些类具有指向主程序拥有的Object 的指针。这是在 C++14 中
出于某种原因,Object 必须满足某些条件 - 它必须有一个已删除的默认构造函数,它的不可复制、不可移动。我需要使用智能指针。
主程序将拥有Object。每个工人阶级都需要从中读取东西
class Object
{
Object() = delete;
~Object();
// Non copyable
Object(const Object &other) = delete;
Object &operator=(const Object &other) = delete;
// Non movable
Object(Object &&other) = delete;
Object &operator=(Object &&other) = delete;
// Constructor
explicit Object(double threshold);
};
class Worker
{
public:
void initialize(const Object& obj)
{
// Option 1 - errors out, complains its non copyable
object_ptr = std::make_shared<const Object>(obj);
// Option 2
object_ptr = std::shared_ptr<const Object>(&obj);
// Option 3
object_ptr = std::shared_ptr<const Object>(&obj, [](const Object*){});
}
void doSomething();
private:
std::shared_ptr<const Object> object_ptr;
};
int main ()
{
Object object;
Worker worker1;
Worker worker2;
worker1.initialize(object);
worker2.initialize(object);
while(1)
{
// Main does stuff to Object
worker1.doSomething();
worker2.doSomething();
}
return 0;
}
在Worker 中初始化指针的最佳方法是什么?
【问题讨论】:
-
是的,@DietrichEpp,shared_ptr 实际上不必保留共享引用。您可以使用别名构造函数来伪造它。你永远不应该,但你可以。
-
如果工人不参与对象的所有权,为什么不让他们保留对对象的引用?如果您需要能够在构造工作程序后初始化引用(或需要能够更改引用),那么这可能是非智能原始指针的合法用例。否则,您似乎在无济于事地增加复杂性。
-
您的模式似乎需要在主程序中使用 shared_ptr 并在您的工作人员中使用weak_ptr。如果需要智能指针,为什么要通过 const 引用传递对象?
标签: c++ c++14 shared-ptr