我想知道是否有一种方法,使我们在一个特定的命名空间的朋友中定义一个类的所有功能?
特别是,我有一个类,例如:
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的朋友.但是,出于好奇,我想知道这样的事情是否可以使用命名空间好吗?
提前致谢.
解决方法
不,这不是一个命名空间.如果没有别的,它将构成“安全漏洞”,因为命名空间可以在任何地方扩展.所以任何人都可以向命名空间添加任意函数,并访问该类的非公开数据.
你最接近的是你提出的解决方案,使这些功能成为一个类的静态成员,并且与类相交.但是再一次,为什么不把它们变成原来的静态成员(你的代码中的C)呢?
除此之外,如果我在代码中遇到了这么多朋友的功能,那么会让我再想想我的设计,我会把它作为一个迹象,我在做错事.