kMa*_*ter 17 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*);
};
Run Code Online (Sandbox Code Playgroud)
和命名空间B:
namespace B {
C* f1(C* x);
C* f2(C* x);
C* f3(C* x);
C* f4(C* x);
C* f5(C* x);
};
Run Code Online (Sandbox Code Playgroud)
现在,我宁愿避免在类定义中编写5行来使命名空间的所有五个函数B与类一起使用,C并告诉编译器命名空间B中定义的所有函数都是类的朋友C(即可以访问它的私有)成员).
我想快速修复是将命名空间更改为类并将函数定义为静态成员,然后将类声明为类B的朋友C.但是,出于好奇,我想知道命名空间是否也可以这样做?
提前致谢.
Rei*_*ica 19
不,它不可能是命名空间.如果没有别的,它将构成"安全漏洞",因为命名空间可以扩展到任何地方.因此,任何人都可以向命名空间添加任意函数并访问类的非公共数据.
你能得到的最接近的是你提出的解决方案,使这些函数成为一个类的静态成员并与该类成为朋友.但话说回来,为什么不首先让它们成为原始类的静态成员(C在你的代码中)?
顺便说一句,如果我在我的代码中遇到了这么多朋友函数的需求,它会让我再次思考我的设计,很难; 我认为这是我做错事的一个标志.
如果你将你的命名空间提升为一个类,你可以一次将许多函数作为友元。它带有(许多)其他缺点,但您实际上可能想要 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);
};
Run Code Online (Sandbox Code Playgroud)