如何隐藏在C ++类?(How can I hide a class in C++?)

2019-07-17 17:22发布

比方说,我有我想成为可见的(一个给定的头文件中),2类和一类是他们的祖先,我想只有前面提到的两个可见其中之一。 我怎样才能实现在C ++中被无形这样的类的功能?

Answer 1:

滥用一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:: ,这将传达给他们不应该使用内部的任何类型的用户,并停止对超载等的任何可能的不期望的效果。 这是如何大多数图书馆(甚至是标准库的实现)“隐藏”从用户类。



Answer 2:

这不可能。

C ++需要一个类在它被用作基本点完全定义,因为它包括在一个类的定义点完全定义的机制,什么是一定有目共睹的谁可以看到说类的定义。

C ++有机制来防止墨菲(事故),但不反对马基雅维利(黑客)。


话虽这么说,目的是本身值得怀疑,我可以捉摸的唯一原因是防止用户从依靠你的事实Derived类从这个派生Fantom基地。 那么,派生私下: class Derived: private Fantom {}; 或使用组合物代替class Derived { private: Fantom _fantom; }; class Derived { private: Fantom _fantom; }; 既能实现这一目标。



Answer 3:

相反,隐藏类的,我建议你diabling利用,如果它。 在例如:

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

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

所以,你可以: - 在你的代码中创建任意数量的裸露类的实例 - 从调用这些实例DoStuff()方法

但是你不能: - 实例隐藏类(私有构造) - 隐藏类成员直接或通过暴露类操作上(他们是私人)



Answer 4:

匿名回答的变化,而不是私有继承的,您可以添加隐藏类的私有成员。

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

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


文章来源: How can I hide a class in C++?