4

ブーストなどのサードパーティ製ライブラリをいくつか使用しています。プロジェクトには 1 つのクラスがあり、「MyClass」と呼びます。

「MyClass」のすべてのパブリック関数は標準型 (int、char、string) のみを使用しますが、プライベート関数はブーストのスマート ポインターと他のライブラリの他のアルゴリズムを使用します。

したがって、クラス (およびその関数) の宣言を H ファイルに書き込む前に、いくつかのインクルード ファイルを記述します。

プロジェクトをコンパイルするには、追加のインクルード ライブラリをプロジェクト プロパティに追加します。そして、すべてがうまくいきます。

問題は、USERPROJECT という別のプロジェクト (クラスは extern) からこのクラスを使用したい場合、USERPROJECT プロジェクトに MyClass.h ファイルを含める必要があることです。MyClass.h にはブーストなどが含まれているため、何もコンパイルされません。 USERPROJECT で構成されていないもの (ここでは追加のインクルード ライブラリを構成しませんでした。彼はそれらを知る必要がないため、そうしたくありません。それらは MyClass クラスのプライベート関数にあります)。

解決策は何ですか?

  1. MyClass をインターフェイス用と実装用の 2 つのクラスに分割する必要がありますか?
  2. H と MyClass からすべてのインクルードを削除し、前方宣言を使用する必要がありますか? (試してみましたが、コンパイルに失敗しました)
  3. より良い解決策はありますか

前もって感謝します

4

2 に答える 2

2

pimpl イディオムを使用して、コンパイラ ファイアウォールを作成できます。

// header file
class C
{
public:
    ...
private:
    struct Impl;
    boost::scoped_ptr<Impl> m;
};

// cpp file
struct C::Impl
{
    // data member that were in C previously go here //
};

このようにして、ヘッダー ファイルを使用するコードは、クラスの中身を認識しません。この慣用句については、こちらで詳しく説明しています。ただし、リンクする必要があるブースト ライブラリを使用すると、リンク エラーが発生する可能性があります。ブーストのみのヘッダーのみの部分を使用する場合、問題はないはずです。

于 2013-06-05T14:35:10.837 に答える
0

理想は、すべてのプロジェクトですべての外部コンポーネントにアクセスできることです。(そして、すべて互換性のあるオプションなどでコンパイルされています)。

そこを目指せば問題は解決します。また、ブーストを使用したいと思っていたが、同じ障害に直面した他の人々の問題。

それができない場合でも、pimpl を使用した解決策があるかもしれませんが、複雑さ、メンテナンスのオーバーヘッドが追加され、読みやすさがある程度低下します。また、ブーストから使用するものによっては、リンクに追加のライブラリが必要になる場合があるため、問題のコンパイル部分のみを解決する場合があります。(あなたのものがDLLのように自己完結型でない限り)

後者の場合、リンクがクライアント サイトで発生した場合、lib の密輸は必須ですが、フル ブーストして混乱を回避するのも同じ量の作業です。したがって、行動する前にいくつかの調査を行ってください。

于 2013-06-05T14:36:22.217 に答える