2016-09-26 4 views
-1

Итак, я пытаюсь написать функцию копирования, которая копирует все элементы динамически распределенного массива строк.C++ копирование массива строк в контексте определенного класса

В моем файле заголовка он у меня определены как имеющие следующие значения типа/возврата:

#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); 
} 

где размер() возвращает текущий размер Строковый массив. У меня также есть это ограничение на оператора =

//prevent default copy assignment 
StringSet& operator=(const StringSet&) = delete; 

Поскольку я не определен оператор + как часть класса и имеют ограничение для оператора = не включается, я побежал в проблема.

Очевидная проблема здесь в том, что я получаю ошибку:

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

Как я должен идти об этой ошибке без использования + или = операторы?

StringSet конструктор инициализирует динамически выделенную строку массив размера «емкости»

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

Конструктор копирования предполагается создать глубокую копию параметра.

Я понимаю, что мне нужно предоставить std :: copy с начальным итератором, начальным и последующим итератором исходного кода и начальным итератором назначения +, в качестве аргументов для его глубокой копии.

Однако я бы не хотел использовать std :: copy вообще для этого. Как будет выглядеть реализация для цикла 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')| 

Edit:

Я перегруженный оператор []:

StringSet& operator[](const int); 

И это новая ошибка

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

Вам нужно перегрузить оператор '+'. – macroland

+1

Нет, вам не нужно перегружать оператор '+'. Независимо от того, какой контейнер вы используете в классе 'StringSet' для« динамически распределенного массива строк », вам необходимо инициализировать его в конструкторе копирования' arr.size() ', затем передайте начальный итератор контейнера' arr', завершающий итератор, и итератор 'this' для std :: copy. –

+1

Даже игнорируя тот факт, что ваш код синтаксически неверен, вы оставили слишком много информации, чтобы люди могли вам помочь. Что делает конструктор, который принимает размер? Что делает 'copy()' для 'StringSet'? Какой результат вы ожидаете получить, добавив размер в 'StringSet'? – Peter

ответ

1

Вам нужно перегрузить оператор +, грубо:

class StringSet{ 
    public: 
    StringSet(const StringSet&); 
    StringSet& operator+(const StringSet& , int); 

BTW, если ваш класс может поддерживать как входные и выходные итераторы, то вы можете просто использовать std::copy(arr.first(), arr.last(), a2.first()) который было бы лучше, конечно,

+0

Я собирался сделать это, но мне было интересно, есть ли другой способ сделать это. Похоже, это может быть единственным решением этой проблемы. Спасибо за ваш ответ :) – TigerCode

+0

@TigerCode Если вы считаете, что это правильный код, то, пожалуйста, примите ответ, нажав галочку справа на левой стороне внизу вверх – PnotNP

+0

Я ищу решение, в котором я не должен использовать std :: copy для копирования содержимого массива. – TigerCode