假设我有两个班级和酒吧,我想在不更改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。没有其他方法,阿法克。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top