簡體   English   中英

如何在C ++中隱藏類?

[英]How can I hide a class in C++?

假設我有兩個類,我希望它們在一個給定的頭文件中是可見的,一個類是它們的祖先,我希望它只對前面提到的兩個類可見。 如何在C ++中實現隱藏的類功能?

濫用一個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清楚的名稱namespace例如impl::detail:: ,它將向用戶傳達他們不應該在里面使用任何類,並停止任何可能的重載等不良影響。 這就是大多數庫(甚至是標准庫實現)從用戶“隱藏”類的方式。

這不可能。

C ++要求一個類在它被用作基礎時完全定義,並且由於它的包含機制,在類的定義點完全定義的任何東西都必須對所有可以看到所述類的定義的人可見。 。

C ++有保護Murphy(事故)但不針對Machiavelli(黑客)的機制。


話雖這么說,目的本身就是可疑的,我能理解的唯一原因是阻止用戶依賴你的Derived類來自這個Fantom基礎這一事實。 好吧,私下class Derived: private Fantom {};class Derived: private Fantom {}; 或使用組合而不是class Derived { private: Fantom _fantom; }; class Derived { private: Fantom _fantom; }; 都會實現這一點。

而不是隱藏類,我建議使用diabling如果它。 例如:

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類(私有構造函數) - 直接或通過Exposed類(它們是私有的)操作Hidden類成員

匿名答案的變體,而不是私人繼承,您可以添加隱藏類的私有成員。

class Hidden
{
   private:
      friend class Exposed;
      Hidden() {}
      int hidden_x;
};

class Exposed
{
  public:
      Exposed() {}
      void DoStuff() { printf( "%d" , hidden.hidden_x ); }
  private:
      Hidden hidden_;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM