2016-08-17 13 views
3

コードは次のとおりです。次のC++コードで 'new'演算子を使用する必要がありますか?

class base{ 
    base(){} 
    virtual base* copy()const=0; 
    virtual ~base(){} 
}; 
class derived:public base{ 
    derived(){} 
    base* copy()const; 
    ~derived(){} 
}; 
base* derived::copy()const{ 
    return new derived(*this); 
} 

それが機能copy()か、なぜコードがnew演算子を使用してnew演算子を使用する必要ですか?いいえ、単に極めてに言えば

const base* derived::copy()const{ 
    return this;// note: this pointer is const. 
} 
+5

copyという名前のメソッドが返されますか? –

+4

あなたはコピーコンストラクタについて語りましたか? –

+2

いいえ、あなたは 'this'を返すべきではありません。関数名は、それが新しいオブジェクトであることを意味しますが、元のオブジェクトとは独立しています。 – StoryTeller

答えて

11

は、私が直接このように、thisポインタを返す必要があります。

C++のthisキーワードは、「このオブジェクトの現在のインスタンスへのポインタ」を意味する文法的な砂糖の小さなビットです。

copy方法は、英語の定義により、メモリで異なる位置を占める新しいあらゆる方法で最初に同じオブジェクトが、を返します。 copyメソッドからthisを返すことは、 "コピーされた"オブジェクトにポインタを返すので、当然、このパラダイムで壊れてしまいます。

+0

非常に素敵なフレーズ。 –

+0

@Sebastian:新しいオブジェクトを返すことは、ユーザーの習慣のせいかもしれないと考えてもいいですか? – Tong

-1

あなたの関数

base* derived::copy()const{ 
    return new derived(*this); 
} 

正しいように思える - あなたはここで「新しい」演算子を使用する必要があります。それ以外の場合は、クラスインスタンスのローカルインスタンスを作成し、そのローカルインスタンスへのポインタを返します。メソッドの実行後、ローカルインスタンスは無効になります(スコープ外であるため)。

関連する問題