C ++在定义的类

时间:2016-09-26 02:18:45

标签: c++ class c++14 copy-constructor deep-copy

所以我正在尝试编写一个复制函数来复制动态分配的字符串数组的所有元素。

在我的头文件中,我将其定义为具有以下类型/返回值:

#include <algorithm> 
#include <string>
using std::string
using std::copy

class StringSet{
  public:
     StringSet(const StringSet&);

为了实施,我有:

StringSet::StringSet(const StringSet& arr)
{
    auto a2 = StringSet(size());
    copy(arr,arr + size(), a2);
}

其中size()返回字符串数组的当前大小。 我对operator =

也有这个限制
//prevent default copy assignment
StringSet& operator=(const StringSet&) = delete;

由于我没有将运算符+定义为类的一部分并且对运算符的限制=不包括在内,所以我遇到了问题。

这里显而易见的问题是我收到错误:

error: no match for 'operator+' (operand types are 'const StringSet' and 'int')

如果不使用+或=运算符,我该如何处理此错误?

StringSet构造函数初始化一个动态分配的大小为“capacity”的字符串数组

StringSet::StringSet(int capacity)
: arrSize{capacity},
    arr{make_unique<string[]>(capacity)}
{
}

复制构造函数应该创建其参数的深层副本。

我的理解是我需要提供std :: copy,其中包括源+开始迭代器,源+结束迭代器以及目标+开始迭代器作为其深层复制的参数。

但是,我想完全没有使用std :: copy。在这种情况下,深度复制的for循环的实现方式如何?

我尝试过编写for循环,但是我遇到了运算符[]

的编译错误
StringSet::StringSet(const StringSet& a)
{
    auto a2 = StringSet(currentSize);
    for (auto i=0; i < currentSize ; i++ )
        {
        a2[i] = a[i];
        }
}

错误

error: no match for 'operator[]' (operand types are 'StringSet' and 'int')|
error: no match for 'operator[]' (operand types are 'const StringSet' and 'int')|

编辑:

我已经重载了operator []:

StringSet& operator[](const int);

这是新错误

error: passing 'const StringSet' as 'this' argument discards qualifiers [-fpermissive]|
error: use of deleted function 'StringSet& StringSet::operator=(const StringSet&)'|

1 个答案:

答案 0 :(得分:1)

您需要重载+运算符,大致:

class StringSet{
  public:
     StringSet(const StringSet&);
     StringSet& operator+(const StringSet& , int);
顺便说一句,如果你的类可以同时支持输入和输出迭代器,那么你可以简单地使用std::copy(arr.first(), arr.last(), a2.first()),这当然会更好