比方说,我有我想成为可见的(一个给定的头文件中),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++?