假设我想实现一个可复制的类,所以我可以实现复制构造函数和赋值运算符。但是,唯一和共享指针变量的正确实现和处理是什么?看看这个有两种类型指针的人为例子:
标题文件
#include <memory>
using std::unique_ptr;
using std::shared_ptr;
class Copyable
{
private:
unique_ptr<int> uniquePointer;
shared_ptr<int> sharedPointer;
public:
Copyable();
Copyable(int value);
Copyable(const Copyable& other);
~Copyable();
public:
int GetUniqueValue() { return *uniquePointer; };
int GetSharedValue() { return *sharedPointer; };
Copyable& operator=(const Copyable& other);
};
CPP档案
#include "stdafx.h"
#include "Copyable.h"
using namespace std;
Copyable::Copyable() :
uniquePointer(make_unique<int>()), sharedPointer(make_shared<int>())
{
}
Copyable::Copyable(int value) :
uniquePointer(make_unique<int>(value)),
sharedPointer(make_shared<int>(value))
{
}
Copyable::Copyable(const Copyable& other) :
uniquePointer(make_unique<int>(*other.uniquePointer)),
sharedPointer(make_shared<int>(*other.sharedPointer))
// OR
sharedPointer(other.sharedPointer)
{
}
Copyable::~Copyable()
{
}
Copyable& Copyable::operator=(const Copyable& other)
{
if (&other != this)
{
uniquePointer.reset();
uniquePointer = make_unique<int>(*other.uniquePointer);
sharedPointer = make_shared<int>(*other.sharedPointer);
// OR
sharedPointer = other.sharedPointer;
}
return *this;
}
用法允许复制
Copyable copyable1(5);
int uniqueValue1 = copyable1.GetUniqueValue();
int sharedValue1 = copyable1.GetSharedValue();
Copyable copyable2 = copyable1;
int uniqueValue2 = copyable2.GetSharedValue();
int sharedValue2 = copyable2.GetSharedValue();
使用make_unique函数复制唯一指针的方法只有一种,但共享指针呢?我应该分配它还是使用make_shared函数?
更新 - 复制与移动
一个更广泛的说明我正在试图找出何时使用什么。如果我决定使用复制,为什么我会使用unique_ptr?似乎shared_ptr是要走的路。同样,如果使用移动语义,unique_ptr似乎还有很长的路要走。一般来说只是。我或许应该把它分成一个单独的问题。
答案 0 :(得分:1)
共享指针怎么样?我应该分配它还是使用make_shared函数?
tl; dr这项任务很可能就是你要找的。 p>
这完全取决于所涉及的类的语义;
shared_ptr
的状态,则需要转让或副本shared_ptr
。对象如果不需要共享状态,那么您最好使用unique_ptr
作为一般&#34;经验法则&#34 ;;
如果您的类型包含仅移动成员,则只允许移动。如果您的类型具有可复制成员,则允许复制。在有意义的地方,遵循&#34;价值&#34;类型语义。努力实现零&#34;
的规则