オブジェクトへのポインタのコピーコンストラクタを作成する際に問題が発生しました。これは私の正確な問題です
プライベートデータメンバーとしてオブジェクトs1を持つクラスG1があります。これは構造体のオブジェクトです。
構造体は、vector<pair<int,pointer to another object of a different class>>.
これで、G1のポインターを作成すると、すべて問題ありません。
このポインタを同じクラスの別の新しいポインタにコピーしようとすると、浅いコピーが作成されます。
したがって、最初のポインタを削除しようとすると、2番目のポインタは参照を失います。
私のコードは次のようになります。
template <typename T,typename V>
class G1{
private:
S<typename T> s1;
public:
G1<T,V>(){}
G1<T,V>(const G1<T,V>& g2):s1(g2.s1){}
};
template<typename T>
struct S{
private:
vector<pair<int,B<T>*>> smap;
public:
S<T>(const S& st){
for(vector<pair<int,B<T>*>>::iterator it = st.getMap().begin(); it!= st.getMap().end(); it++){
B<T> bptr = new B<T>(*it->second);
smap.push_back(pair<*(it)->first,bptr>);
}
}
};
//値型を持っているだけのクラスBが存在し、ユーザー定義のコピーコンストラクターは必要ないと仮定します。
void main(){
G1<string,string>* g1= new G1<string,string>;
//values loaded into g1.
G1<string,string>* g2= g1;
delete g1;
g2.display(); //Code breaks at this point since I am not able to create two pointers pointing different locations.
// I am not able to make a new copy of the smap vector which has pointers and hence the problem.
}
何か提案をお願いします。ポインターの割り当てを行っている間、コピーコンストラクターが呼び出されますか?Visual Studioでデバッグしているときに、コピーコンストラクターまたは代入演算子関数が呼び出されているのを確認できません。
ディープコピーを作成する必要があるクラスのポインタメンバーは単純です。ディープコピーを作成する必要のあるクラスでオブジェクトが使用されている他のクラスでポインタが宣言されていると、混乱します。
上記の場合にディープコピーを作成する方法について誰かがヒントを提供できますか?