9

(特定のヘッダー ファイル内で) 表示したい 2 つのクラスと、それらの祖先である 1 つのクラスがあり、その 1 つは前述の 2 つだけに表示したいとします。C++ で見えないクラス機能を実現するにはどうすればよいですか?

4

4 に答える 4

11

を乱用し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::

于 2012-12-30T18:38:31.213 に答える
9

それは不可能。

C++ では、クラスがベースとして使用される時点で完全に定義されている必要があります。そのインクルード メカニズムにより、クラスの定義時点で完全に定義されているものはすべて、そのクラスの定義を見ることができるすべての人に必然的に表示されます。 .

C++ には、マーフィー (事故) から保護するメカニズムがありますが、マキャベリ (ハッキング) から保護するメカニズムはありません。


そうは言っても、目的自体は疑わしいです。私が推測できる唯一の理由は、クラスがこのベースDerivedから派生しているという事実にユーザーが依存するのを防ぐことです。Fantomまあ、プライベートに派生するclass Derived: private Fantom {};か、代わりにコンポジションを使用class Derived { private: Fantom _fantom; };すると、どちらもこれを達成できます。

于 2012-12-30T18:31:49.767 に答える
2

クラスを非表示にする代わりに、それを使用して無効にすることをお勧めします。例:

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 クラスを介して操作する (それらはプライベートです)

于 2014-05-16T15:20:37.900 に答える