我想知道是否有一种方法可以让我们在一个特定的命名空间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
的朋友。但是,出于好奇,我想知道命名空间是否也可以这样做?
提前致谢。
答案 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);
};