朋友mixin模板?

时间:2010-01-27 10:19:26

标签: c++ friend mixins

假设我有两个班级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;
}

尝试调用私有函数时出现编译错误,显然它不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

它不起作用,因为friends无论如何都无法访问privateFunction,因为它是private(后代类无论如何都无法访问私有字段)。如果您将privateFunction声明为protected,则可以使用。

这是关于C ++中Mixins的nice paper。 (PDF链接)

答案 1 :(得分:1)

只有一个班级才能宣布其朋友是谁。它们不能从外部注入。这听起来很简单:如果它被语言允许,它可能会忘记私有关键字,毕竟任何打算访问私有成员的代码都可以使用该技巧。请注意,在派生对象中添加好友关系无济于事,因为无法从派生模板访问该方法。

您可以尝试的任何其他方法都是hackery和非便携式(重写相同的标题更改private public似乎在许多情况下都有效,但在某些极端情况下它会失败)

另请注意,在类模板中,您不能将类型参数声明为朋友,在当前标准中明确禁止它,即使在即将出现的标准中将删除该限制。

答案 2 :(得分:0)

你应该做

void privateFunction(){}

保护。

哎呀,我忘了你不能修改Foo。没有其他办法,afaik。