0

PIMPL イディオムの存在下で静的フィールド メソッドを使用する方法をよりよく理解したいと思います。次のコードを検討してください。

MyClass.h ファイル:

#ifndef MYCLASS
#define MYCLASS

class MyClass{
     public:
     void method();
     static void static_method();

     private:
     Type field;
     static Type *static_field;
}

#endif

MyClass.cpp ファイル:

#include MyClass.h

void MyClass::method(){
     /*OK method definition*/
     field = new Type();   /*OK field construction*/
}

void MyClass::static_method(){
     /*NOT WORKING method declaraion */
     static_field = new Type();   /*not working */
}

次の 2 つのエラーがあります。

  1. メンバー関数 static_method を宣言して静的リンケージを持つことはできません
  2. static_field はこのスコープで宣言されていませんでした

私はニキビのイディオムにあまり慣れていません。

だから私の質問は、PIMPLイディオムを尊重し、それを正常にコンパイルするために、静的メソッドとフィールド宣言をどのように達成するかです?

このコードで何が間違っていますか?

コードを変更するにはどうすればよいですか?

4

3 に答える 3

2

pimplの目的は、コンパイルの依存関係を排除することです。pimplクラスにプライベート静的メンバーがあるという事実は実装の詳細であるため、ヘッダーファイルまたはpimplクラス定義に含めるべきではありません。

pimplクラスのメンバー関数の定義とともに、名前のない名前空間の.cc/.cppファイルにプライベートスタティックを配置します。

于 2011-03-28T10:41:06.723 に答える
1

確かに、あなたは定義を持っている必要があります

Type* MyClass::static_field = new Type();

u'rcppファイルで。これは、この方法で、フィールドをインスタンス化する必要があるオブジェクトファイルをコンパイラに通知するためです。そうしないと、コンパイラはそれを知る方法がありません。

于 2011-03-28T11:00:47.010 に答える
1
  • 検証済みの実際のコードで同じエラーが発生することを示してください
  • .cpp ファイルの関数定義の前に static を置かないでください
  • あなたは持っていませんstatic_field-あなたは2つ持っていますfield
于 2011-03-28T10:34:08.263 に答える