-1

ここにこのコードがあります:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:
    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

私の最初の質問は次のとおりです。

  • "DerivedClass" に "operator=" を記述できますか? (あなたの答えが「はい」の場合、その方法を教えてもらえますか?)

私の2番目の質問は次のとおりです。

  • 上記の答えが「はい」の場合、事前に書いた「operator =」を使用して「コピーコンストラクタ」を作成する方法を教えていただけますか(それが可能であれば)。
4

2 に答える 2

1

copy ctor と op= の本体は、リソースの保存方法 (a1 変数と a2 変数) によって異なります。それらを別のクラスにコピーする必要がある場合は、 SomeClass オブジェクトの完全なコピーを作成する関数を作成する必要があります。別のケース - 単純にポインタ値をコピーできますが、その使用方法、特に削除には十分注意してください。リソース共有の問題に対する最も簡単な解決策は、boost::shared_ptr や c++11 std::shared_ptr などのスマート ポインターを使用することです。

したがって、リソースをコピーする場合:

class DerivedClass : public BaseClass {
    SomeClass* a1;
    Someclass* a2;
public:

    // note: do not forget to assign zeroes to your pointers, unless  you use some kind of smart pointers
    DerivedClass()
    :a1(0), a2(0){}

    DerivedClass(const DerivedClass& d)
                :a1(0), a2(0)
    {
        *this = d;
    }

    DerivedClass& operator=(const DerivedClass& d)
    {
        if (this == &d)
            return *this;

        delete a1;
        a1 = d.a1->clone();

        delete a2;
        a2 = d.a2->clone();

        return *this;
    }


    //constructors go here
    ~DerivedClass() { delete a1; delete a2;}
    // other functions go here ....
};

オブジェクトをコピーする SomeClass の clone() 関数も必要です。

    SomeClass* clone() const
    {
        return new SomeClass();
    }
};
于 2013-07-01T15:48:02.603 に答える