私はビッグ5(コピーコンストラクタ、コピー代入演算子、移動コンストラクタ、移動代入演算子、デストラクタ)の作成に取り組んでいます。そして私は、コピーコンストラクタの構文を少しぶつけました。代入オーバーロード構文のコピーコンストラクタ?
は、私は、次のプライベートメンバを持つクラスのfooを持って言う:
template<class data> // edit
class foo{
private:
int size, cursor; // Size is my array size, and cursor is the index I am currently pointing at
data * dataArray; // edit
}
私はいくつかの任意のサイズX
のこのためのコンストラクタを記述した場合、それは次のようになります。私は以下のコードから=
オーバーロードしていると仮定すると、
template<class data> // edit
foo<data>::foo(foo &bar){
foo = bar; // is this correct?
}
:
私は次のようにする必要があると思いますbar
と呼ばれる別のオブジェクトのコピーコンストラクタを作成したい場合は今
template<class data> // edit
foo<data>::foo(int X){
size = X;
dataArray = new data[size];
cursor = 0; // points to the first value
}
template<class data> // edit
foo<data>::operator=(foo &someObject){
if(this != someObject){
size = someObject.size;
cursor = someObject.cursor;
delete[] dataArray;
dataArray = new data[size];
for(cursor = 0; cursor<size-1;cursor++)
dataArray[cursor] = someObject.dataArray[cursor];
}
else
// does nothing because it is assigned to itself
return *this;
}
コピーコンストラクタは正しいですか?または、*this = bar
の代わりにfoo = bar
を指定する必要がありますか?
テンプレートのコンストラクタはまだ新しくなっていますので、コードでエラーが発生した場合は修正してください。
EDIT 1:マルチンによって下方に設けられた答えのおかげで、私は彼らが下のリストにまとめて、それはより多くの構文上正しい作るために上記のコードにいくつかの編集を行い、//edit
でそれらをコメントしている:
- 以前は
template<classname data>
ですが、間違っているのはそれぞれ関数とクラスがtemplate <typename data>
またはtemplate <class data>
である必要があります。 - 以前
int*dataArray;
これは、テンプレートをmissusesとあなたのFooクラスは内部data
テンプレートパラメータを使用していませんdata* dataArray;
** 1 **コピーコンストラクタを記述して、各メンバーをr.h.sから初期化します。オブジェクト(あなたの現在の 'op ='と同じように)。 ** 2。**コピーコンストラクタに関してコピーの割り当てを記述します。 [コピーとスワップイディオム](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-and-swap)(こちら[こちら](http://stackoverflow.com/questions/3279543)/what-is-the-copy-and-swap-idiom))を参照してください。このようにしなければならない理由は、現在の実装が行うコピーコンストラクタを記述する際に、デフォルトの初期化を行わずに代入するのを避けることです。 – Andrew
参照:http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom – NathanOliver
これは '* this = bar'で、コピーコンストラクタは' const'によってソースを取得する必要があります参照。また、代入演算子は実装が簡単で、[コピーとスワップイディオム](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom?rq=1)を使用するとエラーが発生しにくい)。しかし、この場合、単に 'dataArray'と' size'を 'std :: vector'に置き換え、コピー/ムーブコンストラクタとデストラクタのデフォルトをすべて残しておかなければなりません。代入演算子も簡単になります。 –