(特定のヘッダー ファイル内で) 表示したい 2 つのクラスと、それらの祖先である 1 つのクラスがあり、その 1 つは前述の 2 つだけに表示したいとします。C++ で見えないクラス機能を実現するにはどうすればよいですか?
4 に答える
を乱用しclass
て意志として行動するnamespace
ことはこれを行います。このパターンはお勧めしません。
class hidden_stuff {
private: // hide base from everyone
struct base {
// contents
};
public:
class derived1;
};
typedef class hidden_stuff::derived1 derived1;
class hidden_stuff::derived1
: private hidden_stuff::base {}; // private inheritance required
// or hidden_stuff::base is accessible as derived1::base
実際の解決策(技術的には質問を満たしていませんが)
望ましい解決策は、またはnamespace
などの明確な名前を使用することです。これにより、ユーザーは内部でクラスを使用してはならないことをユーザーに伝え、オーバーロードなどに対する望ましくない影響を防ぐことができます。これが、ほとんどのライブラリ(標準ライブラリの実装でさえ)がユーザーからクラスを「隠す」方法です。impl::
detail::
それは不可能。
C++ では、クラスがベースとして使用される時点で完全に定義されている必要があります。そのインクルード メカニズムにより、クラスの定義時点で完全に定義されているものはすべて、そのクラスの定義を見ることができるすべての人に必然的に表示されます。 .
C++ には、マーフィー (事故) から保護するメカニズムがありますが、マキャベリ (ハッキング) から保護するメカニズムはありません。
そうは言っても、目的自体は疑わしいです。私が推測できる唯一の理由は、クラスがこのベースDerived
から派生しているという事実にユーザーが依存するのを防ぐことです。Fantom
まあ、プライベートに派生するclass Derived: private Fantom {};
か、代わりにコンポジションを使用class Derived { private: Fantom _fantom; };
すると、どちらもこれを達成できます。
クラスを非表示にする代わりに、それを使用して無効にすることをお勧めします。例:
class Hidden
{
private:
friend class Exposed;
Hidden() {}
int hidden_x;
};
class Exposed : private Hidden
{
public:
Exposed() : Hidden() {}
void DoStuff() { printf( "%d" , hidden_x ); }
};
できること: - コード内に任意の数の Exposed クラス インスタンスを作成する - これらのインスタンスから DoStuff() メソッドを呼び出す
ただし、次のことはできません: - Hidden クラスをインスタンス化する (プライベート コンストラクター) - Hidden クラス メンバーを直接または Exposed クラスを介して操作する (それらはプライベートです)