2016-09-26 3 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')| 

編集作業のためのコンパイラエラーを取得しています:私はしました

をオーバーロードされた演算子[]は次のようになります。

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

、あなたのクラスは、入力と出力の両方のイテレータをサポートすることができれば、あなたは、単にstd::copy(arr.first(), arr.last(), a2.first())をどの使用することができますもちろんより良いでしょう

+0

私はこれをやろうとしていましたが、これを行う別の方法があるのだろうかと思っていました。この問題の唯一の解決策かもしれないようです。ありがとうございましたあなたの答え:) – TigerCode

+0

@TigerCodeこれが正しいコードだと思うなら、左側の右側にあるチェックマークをクリックして回答を受け入れてください。 – PnotNP

+0

私は使用する必要がないソリューションを探していますstd :: copy配列の内容をコピーします。 – TigerCode

関連する問題