6

pimpl イディオムを使用する場合、すべてのメソッド定義をクラス定義内に配置することをお勧めしますか? 例えば:

// in A.h

class A {
   class impl;
   boost::scoped_ptr<impl> pimpl;
public:
   A();
   int foo();
}

// in A.cpp

class A::impl {
   // method defined in class
   int foo() {
       return 42;
   }

   // as opposed to only declaring the method, and defining elsewhere:
   float bar();
};

A::A() : pimpl(new impl) { }
int A::foo() {
   return pimpl->foo();
}

私の知る限り、クラス定義内にメソッド定義を配置することに関する唯一の問題は、(1) クラス定義を含むファイルで実装が表示されることと、(2) コンパイラがメソッドをインライン化する可能性があることです。

この場合、クラスはプライベート ファイルで定義されているため、これらは問題ではありません。また、メソッドは 1 か所でしか呼び出されないため、インライン化は効果がありません。

クラス内に定義を配置する利点は、メソッド シグネチャを繰り返す必要がないことです。

それで、これでいいですか?他に注意すべき問題はありますか?

4

4 に答える 4

3

あなたはあなた自身の質問に答えたと思います:両方の解決策は同等です。

ただし、「メソッドは 1 か所でしか呼び出されないため、インライン化は効果がない」とは確信が持てません。関数がインライン化されていない場合、追加の呼び出しが存在する可能性があります。しかし、コンパイラは、外部クラスの 1 行の転送呼び出しからそれらを最適化するのに十分スマートである可能性があります。

結局は好みの問題だと思います。

于 2010-12-23T09:37:34.317 に答える
2

利点:

  • クラスのすべてのコードはローカライズされています

短所:

  • より大きなクラスの場合: スクロールが必要な場合、関数がどのクラスに属しているかを知るのがより困難になります。
  • 関数がすべてのクラス宣言の後に存在する場合、依存関係はより簡単に解決されます。そうしないと、内部クラスの相互依存関係がある場合に、一部のクラス宣言を他のクラス宣言の後に移動し、一部の関数をクラス宣言の後に移動する必要がある場合があります。
于 2010-12-23T10:28:37.610 に答える
1

通常、Impl 内部クラスにはメソッドを追加しませんが、メソッドをインラインで定義しても問題はありません。宣言と定義を別々にするよりもはるかに読みやすいようです。

于 2010-12-23T09:39:15.900 に答える
0

コンパイラがメソッドをインライン化するかどうかは、コンパイラと渡されたパラメーターによって異なります。

pimpl イディオムの場合、Imp の体内でメソッドが定義されているかどうかは問題ではないと思います。個人的には、本当に重要なもの (メンバー変数やメソッドのリストなど) を簡単に確認できるので、それらを外部で定義するのが好きです。

于 2010-12-23T09:49:47.447 に答える