23

(C++ の場合) 構造がヘッダー ファイルで宣言されているクラスがあります。そのヘッダー ファイルは多くのソース ファイルに含まれているため、編集するときに多くのファイルを再コンパイルする必要があります。

クラスには、1 つのソース ファイルでのみ呼び出されるプライベート関数のセットがあります。現在、それらはヘッダー ファイルのクラス構造で宣言されています。このタイプの新しい関数を追加したり、引数を編集したりすると、大量のファイルが再コンパイルされます。関数を定義して呼び出すファイルのみが再コンパイルされるように、関数を別の場所で宣言したいと思います(時間を節約するため)。ただし、内部クラス変数にアクセスできる必要があります。

どうすればこれを達成できますか?

4

4 に答える 4

14

pImpl イディオムを使用する- 可視クラスは実際のクラスへのポインターを保持し、パブリック メンバー関数への呼び出しを転送します。

編集:コメントに応じて

// Foo.h:

class FooImpl; // Do *not* include FooImpl.h
class Foo {
public:
  Foo();
  ~Foo();
  //.. also need copy ctor and op=
  int bar();
private:
  FooImpl * Impl;
};

// FooImpl.h:

class FooImpl {
public:
  int bar() { return Bar; }
private:
  int Bar;
};

// Foo.cpp:

#include "FooImpl.h"

Foo::Foo() { Impl = new FooImpl(); }
Foo::~Foo() { delete Impl; }
int Foo::bar() { return Impl->bar(); }

クラスの実際の実装を保持しますFooImpl-パブリックメンバーのFooコピーが必要であり、これらへの呼び出しを単純に転送する必要があります。すべてのユーザーには「Foo.h」のみが含まれます。ユーザーに変更が表示されることなく、すべての個人情報を変更できます。FooImplFooImplFoo

于 2011-04-14T15:19:19.153 に答える
5

メイン クラス宣言の外でクラスのメンバー関数を宣言する方法はありません。したがって、問題のクラスの外部で、クラスの特定のインスタンスのメンバー変数にアクセスできる関数を宣言する場合、そのインスタンスを関数に渡す以外に方法はありません。さらに、関数がプライベート変数とプロテクト変数にアクセスできるようにする場合は、それらを新しいクラスに配置し、元のクラスをそのフレンドにする必要があります。例えば

header.h:

class FooImpl;

class Foo {
public:
   int bar();
   friend class FooImpl;
private:
   int var;
}

impl.cpp:

#include "header.h"

class FooImpl {
public:
   int bar(Foo &);
}

int FooImpl::bar(Foo &foo) {
return foo.var;
}

int Foo::bar() {
return FooImpl::bar(*this);
}
于 2011-04-16T09:37:33.093 に答える
2

Compiler Firewall、別名 PIMPLをお探しですか?

于 2011-04-14T15:20:40.637 に答える
1

パブリック関数のみを含む抽象基本クラスを作成し、ヘッダーでこれを参照します。実際のクラスを実装として別の場所に作成します。クラスを作成する必要があるソース ファイルだけが、実装クラス ヘッダーを確認する必要があります。

于 2013-09-12T14:10:49.693 に答える