以下是界面:
class SIM{
private:
//private data
public:
Send();
Display();
Recieve();
Encrypt();
};
如何限制Display()
public
部分SIM
部分的Neo
部分对其他类(friend
等除外)的访问权限。我不想使用{{1}}等。
修改
我可以将display()移动到私有,如何只允许NEO类访问它? 0_o
答案 0 :(得分:3)
您可以Display
对一个类型进行虚拟const引用,该类型只能通过您希望能够进行调用的类中的私有嵌套来创建。然后,为了将该类型传递给Display
,您必须是该类的成员。
但是,当friend
完全符合您的要求时,为什么会这样做呢?
代码示例:
class AllowedCaller
{
private:
class FriendHackHelp
{
};
public:
class FriendHack
{
public:
// You can only create a FriendHack from inside this class now...
FriendHack(const FriendHackHelp&) { }
};
void run();
};
class Displayer
{
public:
void Display(const AllowedCaller::FriendHack&) { /* Whatever */ }
};
void AllowedCaller::run()
{
Displayer d;
d.Display(FriendHack(FriendHackHelp()));
}
int main()
{
return 0;
}
答案 1 :(得分:2)
在C ++中,这根本不可能。你可以做的是将Neo
类作为参数传递给Display()
函数作为参考,你会产生类似的效果。
答案 2 :(得分:0)
您还可以将SIM类拆分为2类:可显示(使用显示方法)和SIM(使用其余方法)。然后,在创建Neo类时,只需不要扩展Displayable类。
答案 3 :(得分:0)
让我问你一个问题:neo究竟是什么?它能够从SIM继承吗?如果是这样,请创建Display()protected
而不是private
。
答案 4 :(得分:0)
过去我一直在想这个,请检查以下问题:
programming language with granular method and property access
a way in c++ to hide a specific function
然而,我认为实现这一点的唯一方法(至少在c ++中)是为每个客户端类创建多个接口,并使每个接口成为将访问它的客户端类的朋友。
因此您需要实现具有多重继承的所有和每个接口