假设我有两个班级Foo和Bar,我想在不改变Foo的情况下与Foo建立朋友。这是我的尝试:
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;
}
尝试调用私有函数时出现编译错误,显然它不起作用。有什么想法吗?
答案 0 :(得分:2)
它不起作用,因为friends
无论如何都无法访问privateFunction
,因为它是private
(后代类无论如何都无法访问私有字段)。如果您将privateFunction
声明为protected
,则可以使用。
这是关于C ++中Mixins的nice paper。 (PDF链接)
答案 1 :(得分:1)
只有一个班级才能宣布其朋友是谁。它们不能从外部注入。这听起来很简单:如果它被语言允许,它可能会忘记私有关键字,毕竟任何打算访问私有成员的代码都可以使用该技巧。请注意,在派生对象中添加好友关系无济于事,因为无法从派生模板访问该方法。
您可以尝试的任何其他方法都是hackery和非便携式(重写相同的标题更改private
public
似乎在许多情况下都有效,但在某些极端情况下它会失败)
另请注意,在类模板中,您不能将类型参数声明为朋友,在当前标准中明确禁止它,即使在即将出现的标准中将删除该限制。
答案 2 :(得分:0)
你应该做
void privateFunction(){}
保护。
哎呀,我忘了你不能修改Foo。没有其他办法,afaik。