0

この小さなクラスを作成しました。このクラスは、このクラスのオブジェクトが作成されるたびにUUIDを生成します。

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>    

class myClass {

public:

    boost::uuids::uuid GetUUID();

    virtual ~myClass();

    myClass() {   // constructor
        mId = boost::uuids::random_generator()();
        std::cout<< "object created with uuid " << mId <<std::endl;
    }

private:

    boost::uuids::uuid mId;

}

ある時点で、これらのオブジェクトをベクトルにプッシュし、単純な代入演算子を使用してそのベクトルを別のベクトルと同等にします。新しいベクター内のオブジェクトが新しいUUIDを生成しないようにするために、コピーコンストラクターを作成します。しかし、ご覧のとおり、コンストラクターには引数は必要ありません。そのため、コピーコンストラクターの書き方がわかりません。さらに、1つのUUIDではなく複数の変数がある場合、その状況をどのように処理しますか?

4

3 に答える 3

5

次の署名が必要です。

 myClass(const myClass& other)
 {
     mId = other.mId;
 }

また、代入演算子

 myClass& operator=(const myClass& other)
 {
     mId = other.mId;
     return *this;
 }

これらを実装しない場合、コンパイラによって生成されたものはシャローコピーを実行するため、新しいUUIDは生成されないことに注意してください。しかし、三つのルールに従うために、そこにそれらを持っている必要があります(結局、デストラクタがあります)。

于 2012-07-04T09:28:18.563 に答える
2

コンパイラーは、コピーコンストラクターと代入演算子を生成します。この操作が行う必要があるのがすべてのメンバーをコピーすることだけである場合、コンパイラーが生成した操作はこれを正確に実行します。そうでない場合、コピーコンストラクターの署名は次のとおりです。

myClass( const myClass& other )

割り当ての署名は次のとおりです。

myClass& operator=( const myClass& other )

敬具

トルステン

于 2012-07-04T09:31:06.353 に答える
0

この場合、コンパイラーによって生成されたデフォルトのコピーコンストラクターと代入演算子は期待どおりに機能するはずなので、明示的に定義する必要はありません。

于 2012-07-04T09:38:14.493 に答える