著作一覧 |
同感。すごく同意。 っていうか、こないだstdの範囲だけをincludeするコンソールアプリケーションを作ろうと思ったのだが、そこでWin32にべったり依存する部分をDLLとして切り出すことにした。
でも、どんなに、publicなメソッドを汎用にしようとしても
class Foo { public: Foo(const char* p); virutal void useful(int&, char*&); private: HANDLE search(HMODULE, HINSTANCE); // ←ああああああ!! };
という具合にヘッダファイルを作ってしまったら、利用先もwindows.hをincludeしなければならないことに気づいて悲しくなってしまった。
そこでvoid* search(unsigned int, unsigned int);などとする方法は無いわけではない(ソースで直接キャストしまくるか、呼び出し頻度が高ければstaticなキャストしまくるフィルター関数をinlineとかで作って(マクロでも良いけど)それにラップさせて呼び出すとか)。あるいは
#if !defined(HANDLE) #define HANDLE void* #endif class Foo {
とか書くという方法もないわけではない。でも、積極的にやりたい方法ではない。というか、#defineではなくtypedefだった場合はどうするかとか。
こっちでincludeしておくという方法は無いわけではないのだが
#include <windows.h> class Foo {
これがいやなのは、DLLとそのDLLのヘッダだけ、SDK無しの環境へ持っていってもコンパイルできないことだ(というのはDLLのヘッダがSDKを要求することになるからだ。だったら、直接アプリケーション側でincludeするのと同じことだ)。
そこで、分離することを考えてみる。
公開するヘッダ class Foo { public: Foo(const char* p); virutal void useful(int&, char*&); private: void* psearcher; }; 公開しないヘッダ inline Seacher& searcher(void* p) { return *(Searcher*)p; } class Searcher { public: HANDLE search(HMODULE, HINSTANCE); } ソース(公開しない) #include "foo.h" #include "searcher.h" Foo::Foo(const char* p) { ... psearcher = new Searcher(); } void Foo::useful(...) { ... searcher(psearch).search(...); ... }
しかしどうにもばかばかしい感じがする。というか結局void*かとか。
ジェズイットを見習え |
Cの方がOOP向き
公開したいメンバーだけを集めた公開用ヘッダーファイルを作ればいいのでは?
その方法は、virtualなprotectedメソッドが存在すると破綻すると思います(そのへんよろしくしてくれるかも知れないので断言できないけど)。
void* 最強!<br>32ビットとポインタのサイズとハンドルとを考えると夜も眠れないので昼寝るのがお勧め。
64ビットポインターも現実的に視野に入ってきましたしね。おそるべきtime_tとかもあるし。