設計

自分のライブラリの目的は Luna を wrap することなので、LunaCat を使う側は、DirectX や Luna が可視状態になってはいけない。
つまり、LunaCat のヘッダで、DirectX や Luna のヘッダをインクルードしてはならない。


なので、共通インクルードファイル stdafx.h を作っておいて、そこで DirectX や Luna のヘッダをインクルードし、その stdafx.h を .cpp のファイル内の先頭で、.h のファイルより前にインクルードするようにする。

// Test.h
class Test{
private:
    LunaSurface _surface;
};
// Test.cpp
#include "stdafx.h"
#include "Test.h"

ヘッダで Luna.h をインクルードしていないが、stdafx.h でインクルードしているので、これで一応 .lib のファイルを作ることは出来る。
しかし、LunaCat を使う側は、この Luna.h をインクルードしていないので、LunaSurface の情報が分からず、エラーが出る。


この問題を解決するために、pImpl パターンを使ってみる。

// Test.h
class Test{
public:
    Test();
private:
    class Impl;
    smart_ptr< Impl > pImpl;
}
// Test.cpp
#include "stdafx.h"
#include "Test.h"

class Test::Impl{
public:
    LunaSurface _surface;
}

Test::Test() : pImpl( new Impl ){}

こうすることによって、Test は完全に Luna と分離することが出来る。


本当は、全てのクラスについてインターフェースを作って、外から見えないところに実オブジェクトのクラスを宣言しておいて、CreateInstance かなんかで実オブジェクトを生成すればいいのだけれども、さすがにそれはめんどいので(;´Д`)