在具有智能指针的类上正确实现Copy Constructor和Equals Operator

时间:2014-07-22 14:32:34

标签: c++ pointers copy-constructor smart-pointers assignment-operator

假设我想实现一个可复制的类,所以我可以实现复制构造函数和赋值运算符。但是,唯一和共享指针变量的正确实现和处理是什么?看看这个有两种类型指针的人为例子:

标题文件

#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似乎还有很长的路要走。一般来说只是。我或许应该把它分成一个单独的问题。

1 个答案:

答案 0 :(得分:1)

  

共享指针怎么样?我应该分配它还是使用make_shared函数?

tl; dr这项任务很可能就是你要找的。

这完全取决于所涉及的类的语义;

  • 如果您希望对象共享shared_ptr的状态,则需要转让或副本
  • 如果您希望每个对象都维护自己的状态,请根据&#34;其他&#34;创建新的shared_ptr。对象

如果不需要共享状态,那么您最好使用unique_ptr

作为一般&#34;经验法则&#34 ;;

  

如果您的类型包含仅移动成员,则只允许移动。如果您的类型具有可复制成员,则允许复制。在有意义的地方,遵循&#34;价值&#34;类型语义。努力实现零&#34;

的规则