3

私は C++ のライブラリに取り組んでおり、その一部は、必要ないくつかの OS 関数の抽象化レイヤーです。Windows API で実装を開始しましたが、#ifdef などを使用して他のプラットフォームのサポートを追加する予定です。

しかし、問題になり始めているのは、Windows.h を含めると、必要のない残りのコード全体に伝播し、特にライブラリであるため、使用する他の人のコードも汚染されることです。それ。Windows API が名前空間またはそのコードを区別する明確な方法を使用したかどうかは気にしませんが、代わりに、small、near、far (小文字) などのかなり一般的な単語を #define し、関数名の多くはまた、かなり一般的です。

したがって、コードのプラットフォーム固有の部分だけがこれらにアクセスでき、それが他の場所に含まれていないことを本当に望んでいます。明らかな解決策は、CPP ファイルに Windows.h のみを含めることですが、プラットフォーム固有のデータ型または構造の一部が次のようなクラス メンバー変数であるため、常に可能であるとは限りません。

class Window {

public:

    // ...

private:
    HWND handle;

};

これを達成する方法はありますか?

ありがとう。

4

1 に答える 1

6

pimpl イディオム ( http://en.wikipedia.org/wiki/Opaque_pointer ) を使用します。C++ プログラミング言語の制限により、情報を隠すには、このようなトリックを使用する必要があります。

これを行う方法の 1 つは、C で行うのと同じ方法で行うことです (次の理由により、C ではまったく問題はありません): ヘッダー ファイルで構造体を前方宣言し、その内容を次のように定義します。実装ファイル。

ほとんどの人は、例のプライベート部分全体を独自の構造体に抽出することでこれを行います。その内容は実装ファイルでのみ定義され、ヘッダー ファイルにポインターを配置するだけで、プライベート部分の唯一のメンバーとしてクラス。

また、windows.h が提供するものを削除するために、#include の前に WIN32_LEAN_AND_MEAN を定義します。

于 2013-02-07T15:08:46.573 に答える