2017-04-09 11 views
2

は私がその後、私は私のクラスを変更、機能copy-swap idom:クラスメンバーを変更するとどうなりますか?

void MyClass::swap(MyClass& other) 
{ 
    std::swap(a,other.a); 
    std::swap(b,other.b); 
} 

た場合を作成し、メンバーaを削除するコピー・スワップ・イディオムを使用するために、クラス

class MyClass 
{ 
public : 
int a; 
int b; 
} 

に持って、その後、コンパイラは、意志swap関数で不平を言っても問題ありません。

もし私がを追加すると、新しいメンバーが追加された場合、私のswapの機能はもう正しくありません。スワップ機能に新しいメンバーを追加することを忘れないために私は何ができますか?

+0

プログラマーの人生へようこそ。 C++はこの状態を検出する方法がありません。あなたができる最善の方法は、クラスを変更した人のためにドキュメンテーション(コメント)を追加することです。 –

+0

一般に、 'std :: swap'が非効率である場合には、独自の' swap'を書く必要があります。 –

答えて

5

問題は、あなたの答えがコピーとスワップイディオムではないということです。実際のコピーとスワップイディオムは、コピーコンストラクタを記述し、クラスの操作を移動することです。後者は、std :: swapを使って効率的なスワップ操作を提供します。次に、クラスコピーコンストラクタを呼び出してローカルコピーを作成して、コピー代入を記述します。 *これを一時的なものと交換してください。あなたはメンバーごとにそれをしません。

忘れないようにするには、特別なメンバー関数を書き込まず、コンパイラで生成するようにしてください。これはゼロのルールと呼ばれます。ほとんどのクラスでは、これらのメソッドを記述する必要はなく、生成されたものが正しいようにメンバーを選択する(または書き込む)だけです。メンバを追加するときに追加のメンテナンスが必要ない理由の1つ。

最後に、リソース管理クラスを作成していて、これらの関数を手作業で記述している場合、必ずコピーとスワップを使用する必要はありません。コピーとスワップは、基本的にパフォーマンスを強化し、強力な例外安全性を実現します。私はほとんど例外的な安全性をほとんど使用していないし、多くの分野ではこのようなことを書くのは現実的ではありません。必要な場合にのみ使用してください。

+0

コピーコンストラクタと移動操作が特別な処理(デフォルトではない)をしなければ、右 ?しかし、リチャード・シュナイダー氏のように、コピー/ムーブが何かをしなければならない場合は、私がクラスを変更するときに、これらの「特別な」操作を思い出させるためにヘッダーにコメントを残す必要があります。 –

+0

@Laurent Claessensコメントを残しません。メンバを追加または削除するときは、明らかにすべての関数を調べ、すべてが一貫して正しいことを確認する必要があります。それはちょうど与えられたものです。ゼロのルールに従えば、多くの場合、何もする必要はありませんが、常にそれについてチェックしたり考える必要があります。 –

関連する問題