17

次のようなヘッダー ファイルを使用して静的ライブラリを作成している場合:

// Myfile.h

#include "SomeHeaderFile.h" // External library

Class MyClass
{

// My code

};

私自身のプロジェクト内で、コンパイラ (私の場合は Visual Studio) に SomeHeaderFile.h を探す場所を伝えることができます。ただし、ユーザーにこれを心配してほしくありません。コンパイラに SomeHeaderFile.h の場所を通知することなく、ヘッダーをインクルードできるようにする必要があります。

この種の状況は通常どのように処理されますか?

4

2 に答える 2

16

これは、古典的な「コンパイル ファイアウォール」シナリオです。次の 2 つの簡単な解決策があります。

  1. 外部ライブラリから必要なクラスまたは関数を前方宣言します。次に、外部ライブラリのヘッダー ファイルを cpp ファイル内にのみ含めます (ヘッダーで前方宣言したクラスまたは関数を実際に使用する必要がある場合)。

  2. 非公開でのみ (cpp ファイルで) 宣言および定義する「実装」クラスを前方宣言する場合は、PImpl イディオム (または Cheshire Cat) を使用します。そのプライベート クラスを使用して、外部ライブラリに依存するすべてのコードを配置し、パブリック クラス (ヘッダー ファイルで宣言されているクラス) にその痕跡が残らないようにします。

最初のオプションを使用した例を次に示します。

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class some_external_class;  // forward-declare external dependency.

class my_class {
  public:
    // ...
    void someFunction(some_external_class& aRef);  // declare members using the forward-declared incomplete type.
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

void my_class::someFunction(some_external_class& aRef) {
  // here, you can use all that you want from some_external_class.
};

オプション 2 の例を次に示します。

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class my_class_impl;  // forward-declare private "implementation" class.

class my_class {
  private:
    std::unique_ptr<my_class_impl> pimpl; // a vanishing facade...
  public:
    // ...
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

class my_class_impl {
  private:
    some_external_class obj;
    // ...
  public:
    // some functions ... 
};

my_class::my_class() : pimpl(new my_class_impl()) { };
于 2012-12-20T19:25:30.843 に答える
4

外部ヘッダー ファイルに次のものが含まれているとします。

外部.h

class foo
{
public:
   foo();
};

そして、あなたのライブラリでは foo を使用します:

myheader.h:

#include "external.h"

class bar
{
...
private:
   foo* _x;
};

コードをコンパイルするには、foo クラスを前方宣言するだけです (その後、インクルードを削除できます)。

class foo;

class bar
{
...
private:
   foo* _x;
};

次に、ソース ファイルに external.h を含める必要があります。

于 2012-12-20T19:21:16.420 に答える