タイトルの通り、
クラスの宣言を全部公開したくないです。
例えば、
class foo
{
typedef struct
{
int a;
}hoge;
public:
void func1();
private:
void func2();
}
こういう場合はfunc1();だけを公開したいけど
classから}までを全部書いてないとエラーになります。
派生させて隠そうとしても基本クラスのヘッダを
Includeしてれば同じことだし…
どうにか隠す方法は無いでしょうか?
「隠す」とはどういう意味で用語を使っていますか?
メンバの存在を他人に見せない?
private なメンバは、外部からは呼べませんから、あっても使えないので
隠されているのと同じことになると思われますけど。
クラスの定義全部を他のプログラムで#inludeさせたくない、という意味ですか?
C++のclassに抽象化したinterfaceを多重継承してこのinterfaceのポインタだけ
公開する、というやり方もあります。
>「隠す」とはどういう意味で用語を使っていますか?
隠すとは使えななくするだけでなく見えなくする意味。
クラスの宣言自体みせたくない。関数プロトタイプだけ見せたい感じ。
こんな風に出来れば理想的。
class foo;
void foo::func();
>クラスの定義全部を他のプログラムで#inludeさせたくない、という意味ですか?
そうです。上記のとおり。
>C++のclassに抽象化したinterfaceを多重継承してこのinterfaceのポインタだけ
>公開する、というやり方もあります。
やり方は知ってますが、もっと簡単にできないかなと…
どうも簡単にはできそうも無いのでinterface使った方法で
やることにします。
そんなの隠しても意味ないとかは言わないでね。
色々事情があって…
とにかくレスありがとうございました。
こんなことしたことありますよ。あまり意味ないと今では思っています。
外部に提供するのは hoge.h と hoge.lib または hoge.obj のみ。
hoge.cpp と hoge_privates.h は提供しない。
--hoge.h--
class hoge_t {
#if defined(INCLUDED_FROM_HOGE_CPP)
#include hoge_privates.h
#endif
public:
hoge_t();
~hoge_t();
virtual void do_it();
};
--hoge_privates.h--
// Must be included only within hoge.cpp
int x;
int y;
void workhorse(int val);
--hoge.cpp--
#define INCLUDED_FROM_HOGE_CPP
#include hoge.h
仮想関数の存在や継承派生関係は hoge.cpp 以外からも明らかにしておかないと
vtbl/vptr の実装が不可能になるので、そーいうのは hoge_privates.h には置けない。
今は「作業関数の存在を他人に知られても、使えないんだからどーでもいいぢゃん」に
意見を修正しちゃいました。
hoge.lib を提供した時点で逆汗されたら同じことぢゃん。ってことで。
あー、メンバ変数は、利用側も sizeof を知る必要があるので公開側に持っていく必要があり
ます。
メンバ変数の存在そのものも隠蔽したいのであれば interface しかないですね。
--- foo.h ---
class foo {
public:
foo();
~foo();
// 公開するもの全部
private:
struct foo_impl;
foo_impl* secret; // ナイショなメンバ変数/関数
};
--- foo.cpp ---
#include foo.h
class foo::foo_impl {
// ナイショな実装
};
foo::foo() { secret = new foo_impl(); }
foo::~foo() { delete secret; }
なんてね。
# このネタ、Cマガに書きました (^^
tetrapodさん
επιστημηさん
レスありがとうございます。
色々やりかたあるんですね。
勉強になります。