9

假设我有 2 个我希望可见的类(在给定的头文件中)和一个作为其祖先的类,我希望仅对前面提到的两个类可见。如何实现在 C++ 中不可见的类功能?

4

4 回答 4

11

滥用 aclass以作为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

真正的解决方案(虽然在技术上不能满足问题)

一个更可取的解决方案是使用明确命名namespaceimpl::or 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 类(私有构造函数) - 直接或通过 Exposed 类对 Hidden 类成员进行操作(它们是私有的)

于 2014-05-16T15:20:37.900 回答
0

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

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

class Exposed
{
  public:
      Exposed() {}
      void DoStuff() { printf( "%d" , hidden.hidden_x ); }
  private:
      Hidden hidden_;
};
于 2018-05-17T21:03:12.460 回答