私はクロスプラットフォームのクラス階層を書いており、プラットフォームに依存する実装を独自のクラスに保持したいと考えています ( #ifdefs
. これは私がこれまでに持っているものですが、コンパイラBaseDef
は非公開であると不平を言っています。コンパイル中にこの基本構造を維持する方法についての助けをいただければ幸いです:-)
編集:ここから、これは不可能であるように思われます。この一般的な構造を維持してコンパイルできる他の方法はありますか?
ルート.h
class Root {
private:
class BaseDef {
virtual void foo() = 0;
virtual void bar() = 0;
};
#ifdef _WIN32
class WinImp;
#else
class NixImp;
#endif
BaseDef* imp;
BaseDef* getImp();
public:
Root() : imp(getImp()) {}
void foo();
void bar();
};
ルート.cpp
#include "Root.h"
void Root::foo() {
imp->foo();
}
void Root::bar() {
imp->bar();
}
WinImp.h
#ifdef _WIN32
#include "Root.h"
class WinImp : public Root::BaseDef {
public:
void foo();
void bar();
};
#endif
WinImp.cpp
#include "WinImp.h"
#ifdef _WIN32
Root::WinImp::foo() {
}
Root::WinImp::bar() {
}
Root::BaseDef* Root::getImp() {
return new Root::WinImp();
}
#endif