2

假设我有两个类 Foo 和 Bar,我想在不更改 Foo 的情况下与 Bar 交 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;
}

尝试调用私有函数时出现编译器错误,因此显然它不起作用。有任何想法吗?

4

3 回答 3

2

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

这是一篇关于 C++ 中的 Mixins的好论文。(PDF链接)

于 2010-01-27T10:30:16.533 回答
1

只有一个类可以声明它的朋友是谁。它们不能从外部注入。这很明显:如果语言允许,它可能会完全忘记 private 关键字,毕竟任何打算访问私有成员的代码都可以使用这个技巧。请注意,在派生对象中添加朋友关系将无济于事,因为无法从派生模板访问该方法。

您可以尝试的任何其他方法都是骇客且不可移植的(重写相同的标头更改privateforpublic似乎在许多情况下都有效,但在某些极端情况下会失败)。

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

于 2010-01-27T10:35:24.953 回答
0

你可能应该做

void privateFunction(){}

受保护。

糟糕,我忘了你不能修改 Foo. 没有其他方法可以做到这一点,afaik。

于 2010-01-27T10:41:34.753 回答