2017-05-07 11 views
1

私は助けが必要です。コピーコンストラクタを登録してディープコピーを行う方法はあまり知られていません。C++ - コピーコンストラクタ、ディープコピーとそれを正しく書く方法

私のコピーコンストラクタが正しく登録されているかどうかは私の質問ですが、そうでない場合はどうすれば書き留めていただけますか非常にありがとうございます。

私ArrayList.h:

template<class T> 
class ArrayList{ 
private: 
T* storage;// T pointer array 
int size;// size of array 

public: 
ArrayList();//constructor 
ArrayList(const &ArrayList);//copy constructor 
}; 

template<class T>//constructor 
ArrayList<T>::ArrayList(){ 
size = 0;// size of array in start 
}//end ArrayList 

template<class T>//copy constructor 
ArrayList<T>::ArrayList(const &ArrayList){ 
T* _storage = T* storage; 
int _size = size; 
} 

template<class T>//destructor 
ArrayList<T>::~ArrayList(){ 
delete[]storage; 
}//end ~ArrayList 

感謝の

答えて

3

ありません、それは正しくありません。今では、浅いコピーを実行しています。つまり、ポインタをコピーするだけです(これはデフォルトのコピーコンストラクタがやっていたものです)。コピーと元がスコープから外れると、2つのデストラクタが同じメモリとバム!

あなたは、私は、これは運動であると仮定し、コピーコンストラクタでメモリを割り当てる要素をコピーし、新しい割り当てられたメモリを指すようにポインタを変更、

template<class T>//copy constructor 
ArrayList<T>::ArrayList(const ArrayList&){ 
    T* copy_storage = new T[size]; 

    for(std::size_t i = 0; i < size; ++i) 
     copy_storage[i] = storage[i]; 

    storage = copy_storage; 
} 

のようなものにする必要があります。そうでない場合は、代わりにstd::vector<T>を使用してください。すべてが自動的に処理されます。

+0

tahnk's。しかし、なぜ私はエラーが発生するエラーC4430:型指定子がない - intが仮定されています。注:C++はdefault-intをサポートしていません\t c:\ projects \ template \ ArrayList.h テンプレート – david

+0

@david参照記号 '&'は、**型**の後に** const ArrayList& '(解答で修正されました)、それに応じてコードを変更してください。また、今ではデストラクタを定義しますが、クラスで宣言しないで、デストラクタを宣言していることを確認してください。 – vsoftco

+0

ありがとうございました。エラーエラーLNK1104:ファイル 'c:\ Projects \ Template \ Release \ Template.exe'を開くことができません\t c:\ Projects \ Template \ LINK \tテンプレート – david

関連する問題