1

ヘッダーファイル.hに保護されたものと公開されたものだけを配置し、コンパイルユニット.cppにすべてのプライベートなものを配置する方法があるかどうか知りたいのですが、ライブラリは他の人によって使用されるため、これが必要です。プライベート宣言と実装を削除するために、すべての.hファイルをコピーして編集する必要はありません。試しましたが、重複宣言エラーが発生しました

もう1つの質問は、プライベート静的なものについてです。ヘッダーファイルで宣言して、.cppユニットに実装できますか?プライベート変数とパブリックgetメソッドを試しましたが、ユニットにメソッドを実装できませんでした。ヘッダーの宣言と実装でのみ機能しました。

[] s、ジョー

4

5 に答える 5

22

これに対処する適切な方法は、pimplイディオムを実装することです。すべてのプライベートデータのクラスまたは構造体を作成し、そのようなオブジェクトへのポインターを前方宣言とともにヘッダーファイルに配置します。これで、ヘッダーファイルからプライベートデータとメソッドは何も表示されなくなります。

于 2009-10-05T21:05:34.973 に答える
5

これに対する正解は、Pimplを使用することです(Pavelが指摘しているように、ポインターを介して)。MatthewWilsonのImperfectC++で説明されている、クレイジーでありながら正しい可能性のある方法もあります。この方法では、内部構造を前方宣言し、クラスに不透明なメモリブロックを含めてから、内部構造をインプレースで構築できます(その定義は実装ファイル)実装ファイルのメインクラスコンストラクター。

ウィルソンがこれを付録で示していることを指摘しておきます。そこでは、賢くなりすぎようとしているプログラマーへの警告として、そのような「プログラミングに対する犯罪」をいくつか告白しています。彼は言い​​ます、そして私はあなたがこれを使うべきではないと言います。ただし、厳密なパフォーマンス要件をオーバーライドする場合は、それが役立つ可能性があります。

于 2009-10-05T21:20:40.123 に答える
0

アンドレアスは答えを持っていますが、これはあなたのコードをあなた自身にとっていくらか鈍くすることに注意してください:

 // header file

 struct hidden_structure;

 class Foo {
     hidden_structure* hidden_data;
 public:
     Foo();
     ~Foo();

     void doStuff();
 };

 // your cpp file

 struct hidden_structure;
     int stuff;
     hidden_structure() : stuff(0) {}
 }

 Foo::Foo() : hidden_data(new hidden_structure) {}
 Foo::~Foo() { delete hidden_data; }

 void Foo::doStuff() { hidden_data->stuff += 34; } // hey, it does a lot of stuff

ご覧のとおり、hidden_​​structure内のデータが多いほど、これは複雑になる可能性があります。

于 2009-10-05T21:11:01.213 に答える
0

Johnのコードと同じですが、参照の代わりにポインターを使用しています。

// file.h
class TheClass_p;
class TheClass{
  public: 
    TheClass();
    ~TheClass();
  private
    TheClass_p *d;

};

// file.cpp
class TheClass_p {
  int foo;
  float: bar;
};

TheClass::TheClass(){
   d = new TheClass_p;
}

TheClass::~TheClass(){
   delete d;
}

編集:メモリリークを解放するためのデストラクタを追加

于 2009-10-05T21:12:18.280 に答える
0

ユーザーの完全なクラス名を宣言できませんでしたが、パブリックとプライベートのみを含む.hファイルにクラス定義を入れ、次にパブリック定義の.cppファイルサブクラスに入れて、プライベートのみを定義しますか?

このような:

.hファイル--

class useThis;   // users actually use this class

class publics {  //this is the interface they see
public:
    int foo;
};

.cppファイル--

#include "foo.h"

class useThis: publics {

private:
    void add(int b);

};

void useThis::add( int b )
{
    foo+= b;
}
于 2009-10-06T00:09:51.063 に答える