将名称空间声明为类的朋友

时间:2013-12-30 11:07:26

标签: c++ namespaces friend-function friend-class

我想知道是否有一种方法可以让我们在一个特定的命名空间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的朋友(即可以访问其私有成员)。

快速修复我想将命名空间更改为类并将函数定义为静态成员,然后将类B声明为类C的朋友。但是,出于好奇,我想知道命名空间是否也可以这样做?

提前致谢。

2 个答案:

答案 0 :(得分:15)

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

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

顺便说一句,如果我在我的代码中遇到了这么多朋友功能的需要,它会让我再次思考我的设计,很难;我认为这是我做错事的一个标志。

答案 1 :(得分:2)

如果将名称空间提升为某个类,则可以同时为多个函数提供帮助。 它带有(许多)其他缺点,但实际上你可能想要一个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);
};