クラスの必要なところだけ公開 – プログラミング – Home

クラスの必要なところだけ公開
 
通知
すべてクリア

[解決済] クラスの必要なところだけ公開


いぬ
 いぬ
(@いぬ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

タイトルの通り、
クラスの宣言を全部公開したくないです。
例えば、

class foo
{
typedef struct
{
int a;
}hoge;
public:
void func1();
private:
void func2();
}

こういう場合はfunc1();だけを公開したいけど
classから}までを全部書いてないとエラーになります。
派生させて隠そうとしても基本クラスのヘッダを
Includeしてれば同じことだし…

どうにか隠す方法は無いでしょうか?


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

「隠す」とはどういう意味で用語を使っていますか?
メンバの存在を他人に見せない?

private なメンバは、外部からは呼べませんから、あっても使えないので
隠されているのと同じことになると思われますけど。


返信引用
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 23年前
投稿: 90
 

クラスの定義全部を他のプログラムで#inludeさせたくない、という意味ですか?
C++のclassに抽象化したinterfaceを多重継承してこのinterfaceのポインタだけ
公開する、というやり方もあります。


返信引用
いぬ
 いぬ
(@いぬ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

>「隠す」とはどういう意味で用語を使っていますか?
隠すとは使えななくするだけでなく見えなくする意味。
クラスの宣言自体みせたくない。関数プロトタイプだけ見せたい感じ。
こんな風に出来れば理想的。
class foo;
void foo::func();

>クラスの定義全部を他のプログラムで#inludeさせたくない、という意味ですか?
そうです。上記のとおり。

>C++のclassに抽象化したinterfaceを多重継承してこのinterfaceのポインタだけ
>公開する、というやり方もあります。
やり方は知ってますが、もっと簡単にできないかなと…

どうも簡単にはできそうも無いのでinterface使った方法で
やることにします。
そんなの隠しても意味ないとかは言わないでね。
色々事情があって…

とにかくレスありがとうございました。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

こんなことしたことありますよ。あまり意味ないと今では思っています。

外部に提供するのは 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 を提供した時点で逆汗されたら同じことぢゃん。ってことで。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

あー、メンバ変数は、利用側も sizeof を知る必要があるので公開側に持っていく必要があり
ます。
メンバ変数の存在そのものも隠蔽したいのであれば interface しかないですね。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

--- 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マガに書きました (^^


返信引用
いぬ
 いぬ
(@いぬ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

tetrapodさん
επιστημηさん
レスありがとうございます。

色々やりかたあるんですね。
勉強になります。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました