0

オブジェクトへのポインタのコピーコンストラクタを作成する際に問題が発生しました。これは私の正確な問題です

プライベートデータメンバーとしてオブジェクト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でデバッグしているときに、コピーコンストラクターまたは代入演算子関数が呼び出されているのを確認できません。

ディープコピーを作成する必要があるクラスのポインタメンバーは単純です。ディープコピーを作成する必要のあるクラスでオブジェクトが使用されている他のクラスでポインタが宣言されていると、混乱します。

上記の場合にディープコピーを作成する方法について誰かがヒントを提供できますか?

4

2 に答える 2

0

「ポインターのコンストラクター」を作成することはできませんが、ポインターのように機能するクラスを作成して、代わりに使用することはできます。それらは「スマート ポインター」と呼ばれ、それは私ができないほど大きなトピックです。ここですべてを教えてください.しかし、標準ライブラリにはauto_ptrという名前の単純なクラスがあり、参照する必要があります.boostライブラリには、多くのスマートポインタクラスも含まれています.「実際の」ポインタの代わりにそれらを使用したい.

于 2011-04-05T02:13:14.567 に答える
0

オブジェクトへのポインターは、指定されたオブジェクトではありません-それは単なるアドレスです。オブジェクトへの参照のように考えることができます。ポインターをコピーしてもオブジェクトはコピーされません。たとえば、常に明示的に作成する必要があります。コピー コンストラクターの呼び出し

G1<string,string>* g2= new G1<string,string>(g1);

G1 クラスの 2 つのポインタを作成し、一方を他方にコピーして前者を削除し、後者を保持する方法はありませんか? この状況で記述できるコピー コンストラクターはありませんか?

クラスへの各ポインターを使用してクラスの新しいコピーを取得する場合 (何に使用できるかはわかりませんが、なぜでしょうか;)、bove として実行するか、ポインターのコピー時にオブジェクトをコピーするポインターのようなクラスを作成できます。 - 私は、theter がそのような動作を実装するすぐに使えるライブラリだとは思いません。作成したポインターの数に関係なく、同じオブジェクトを使用したい場合は、std::auto_ptr または他のライブラリーの同様のスマート ポインター クラスを検討する必要があります。スマート ポインターはオブジェクトを解放するので、delete を呼び出す必要はまったくありません。

于 2011-09-06T06:12:36.310 に答える