题
假设我有两个班级和酒吧,我想在不更改foo的情况下与Bar结交Foo Friend。这是我的尝试:
class Foo
{
public:
Foo(){}
private:
void privateFunction(){}
};
template <class friendly, class newFriend>
class friends : public friendly
{
private:
friend newFriend;
};
class Bar
{
public:
Bar(){}
void callFriendlyFunction()
{
friendlyFoo.privateFunction();
}
private:
friends<Foo, Bar> friendlyFoo;
};
int main(int argc, char* argv[])
{
Bar bar;
bar.callFriendlyFunction();
return 0;
}
在尝试调用私有功能时会遇到编译器错误,因此显然它不起作用。有任何想法吗?
解决方案
它不起作用,因为 friends
无法访问 privateFunction
无论如何,因为它是 private
(无论如何,后代课程都无法访问私人字段)。如果您会声明 privateFunction
作为 protected
, ,它会起作用。
这是一个 不错的纸 关于C ++中的混合蛋白。 (PDF链接)
其他提示
只有一堂课才能宣布其朋友是谁。它们不能从外面注射。这很有意义:如果该语言允许它,它可能根本不会忘记私人关键字,在所有打算访问私人成员的代码之后,都可以使用该技巧。请注意,在派生对象中添加朋友关系无济于事,因为该方法无法从派生模板访问。
您可以尝试的任何其他方法都是黑客和不可携带(重写相同的标头更改 private
为了 public
在许多情况下似乎会起作用,但在某些角落情况下会失败。
另请注意,在类模板中,您无法将类型题词声明为朋友,即使在即将到来的标准中将删除该限制,也可以在当前标准中明确禁止它。
你应该做
void privateFunction(){}
受保护。
糟糕,我忘记了您无法修改foo。没有其他方法,阿法克。
不隶属于 StackOverflow