1

MyClassと呼ばれる2 つのメンバ変数 (どちらもint)を持つ というクラスがあるfirstNumber_としsecondNumber_ます。このクラスにはclone( )、同じ値でオブジェクトの新しいインスタンスを作成し、その新しいインスタンスを返す、呼び出されるメソッドもあります。

問題は、クラスの新しいインスタンスを返すとき、それをポインタとして返すのか、参照として返すのか、それとも単にインスタンス自体として返すのかということです。

// MyClass.h
class MyClass {
private:
    int firstNumber_;
    int secondNumber_;

public:
    MyClass( int numA, int numB ) {
         firstNumber_ = numA;
         secondNumber_ = numB;
    }

    ~MyClass( ) { };

    // This method creates a copy of the object and returns that object.
    // The ( ? ) is there because I am not sure what type the returned value is.
    MyClass ( ? ) clone( ) {
         // Do I just return the new instance? Or do I need to return a reference or a pointer of the new instance?
         return MyClass( firstNumber_, secondNumber_ );
    }
};

これを達成する適切な方法は何ですか?MyClassは他のクラスから継承されないことに注意してください。

前もって感謝します。

4

1 に答える 1

3

メソッドclone()は通常、多相型のインスタンスへのポインターを返すためのものであるため、基本型のポインターで呼び出して、正しい派生型のインスタンスへのポインターを取得できます。単純なコピーの場合、C++ ではクローン メソッドではなくコピー コンストラクターを使用します。

クローン方法:

struct Base{};
struct Foo : Base 
{
  Base* clone() const { return new Foo(*this); }
}:

Base * b1 = new Foo;
...
Base * b2 = b1->clone(); // points to a Foo instance, copy of object pointed at by b1

clone(コンパイラによって生成された) コピー コンストラクタを使用するメソッド。

コピー コンストラクターの使用:

Foo f1;
Foo f2 = f1; // copy assignment

実際のコードでは、これらの例で使用されている生のポインタよりもスマート ポインタを使用する必要があります。

戻り値に関しては、デフォルトでは値で返す必要がありますが、ポリモーフィックclone()な例では、戻りオブジェクトをBase. そのため、動的に割り当てられたインスタンスへのポインターを返します。意図と所有権を明確にする必要があります。この場合、呼び出し元がポインターを所有しており、その割り当てを解除する責任があります。c++11 より前では、これを伝えるにはドキュメントに頼る必要がありました。C++11 では、スマート ポインターを使用できますstd::unique_ptr。これにより、所有権が強制され、明確に示されます。

于 2012-10-18T05:47:22.507 に答える