如何在C++中隐藏类?

inf*_*ous 9 c++ oop visibility

假设我有两个类,我希望它们在一个给定的头文件中是可见的,一个类是它们的祖先,我希望它只对前面提到的两个类可见.如何在C++中实现隐藏的类功能?

Pot*_*ter 10

滥用一个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
Run Code Online (Sandbox Code Playgroud)

实际的解决方案(虽然不是在技术上满足的问题)

优选的解决方案是使用明确命名的namespace诸如impl::或者detail::,其将向用户传达他们不应该在内部使用任何类别,并且停止对过载等的任何可能的不期望的影响.这就是大多数库(甚至是标准库实现)从用户"隐藏"类的方式.


Mat*_* M. 8

这不可能.

C++要求一个类在它被用作基础时完全定义,并且由于它的包含机制,在类的定义点完全定义的任何东西都必须对所有可以看到所述类的定义的人可见. .

C++有保护Murphy(事故)但不针对Machiavelli(黑客)的机制.


话虽这么说,目的本身就是可疑的,我能理解的唯一原因就是阻止用户依赖你的Derived类来自这个Fantom基础的事实.好吧,私下派生:class Derived: private Fantom {};或者使用构图来class Derived { private: Fantom _fantom; };实现这一目标.