假设我有两个类,我想要在可见的(在给定的头文件中)和一个类是它们的祖先,我希望它只对前面提到的两个可见。如何实现在C ++中隐藏的类功能?
答案 0 :(得分: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
一个更好的解决方案是使用明确命名的namespace
,例如impl::
或detail::
,这将向用户传达他们不应该使用任何类,并停止对过载等任何可能的不希望的影响。这就是大多数库(甚至是标准库实现)“隐藏”用户类的方法。
答案 1 :(得分:8)
这是不可能的。
C ++要求在用作基础的位置完全定义类,并且由于其包含机制,在类的定义点完全定义的任何内容都必须对所有能够看到定义的人可见所说的课程。
C ++有保护Murphy(意外)的机制,但不是针对Machiavelli(黑客)。
话虽如此,目的本身是可疑的,我唯一可以理解的原因是阻止用户依赖于Derived
类来自此Fantom
基础的事实。好吧,私下导出:class Derived: private Fantom {};
或使用合成代替class Derived { private: Fantom _fantom; };
都可以实现这一目标。
答案 2 :(得分:2)
我建议使用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()方法
但你不能: - 实例化隐藏类(私有构造函数) - 直接或通过Exposed类(它们是私有的)对Hidden类成员进行操作
答案 3 :(得分:0)
匿名答案的变体,而不是私人继承,您可以添加隐藏类的私有成员。
//The parameters to the below function are year, month minus 1, and day
var deadline = new Date(2018, 6, 1); //This is actually July 1st