25

我想知道是否有一种方法可以让我们使用类在特定命名空间中定义所有函数friend

特别是,我有一堂课,例如:

class C {
    private:
        // ...
    public:
        // ...

        friend C* B::f1(C*);
        friend C* B::f2(C*);
        friend C* B::f3(C*);
        friend C* B::f4(C*);
        friend C* B::f5(C*);
};

和命名空间B为:

namespace B {
    C* f1(C* x);
    C* f2(C* x);
    C* f3(C* x);
    C* f4(C* x);
    C* f5(C* x);
};

现在,我宁愿避免在类定义中写 5 行来使命名空间的所有五个函数都B与类成为朋友,C而只是告诉编译器命名空间中定义的所有函数B都是类的朋友C(即可以访问其私有成员)。

我想一个快速的解决方法是将命名空间更改为一个类并将函数定义为其静态成员,然后将该类声明为 classB的朋友C。但是,出于好奇,我想知道命名空间是否也可以做到这一点?

提前致谢。

4

2 回答 2

24

不,不可能与命名空间成为朋友。如果不出意外,这将构成“安全漏洞”,因为名称空间可以在任何地方扩展。因此,任何人都可以向命名空间添加任意函数并访问该类的非公共数据。

你能得到的最接近的是你提出的解决方案,使这些函数成为类的静态成员并与类成为朋友。但是话又说回来,为什么不首先让它们成为原始类(C在您的代码中)的静态成员?

顺便说一句,如果我在我的代码中遇到了这么多友元函数的需求,那会让我重新思考我的设计,很难;我会把它当作我做错事的迹象。

于 2013-12-30T11:17:03.363 回答
6

如果你将你的命名空间提升为一个类,你可以同时为许多函数添加好友。它具有(许多)其他缺点,但您实际上可能想要拥有 B 级(出于其他原因)。

class C {
    private:
        // ...
    public:
        // ...

    friend struct B_domain;
};

struct B_domain {
    static C* f1(C* x);
    static C* f2(C* x);
    static C* f3(C* x);
    static C* f4(C* x);
    static C* f5(C* x);
};
于 2017-04-26T02:19:15.533 回答