将命名空间声明为类的友元
Declaring a namespace as a friend of a 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 行,以使命名空间的所有五个函数都与类C
B
友好,而只是告诉编译器命名空间B
内定义的所有函数都是类C
的好友(即可以访问其私有成员)。
我想一个快速修复是将命名空间更改为类并将函数定义为其静态成员,然后将类B
声明为类 C
的友元。但是,出于好奇,我想知道命名空间是否也可以这样的事情?
提前谢谢。
不,不可能与命名空间交朋友。如果不出意外,它将构成"安全漏洞",因为命名空间可以扩展到任何地方。因此,任何人都可以向命名空间添加任意函数并访问类的非公共数据。
你能得到的最接近的是你提出的解决方案,使这些函数成为类的静态成员,并与类成为朋友。但话又说回来,为什么不首先使它们成为原始类(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);
};
相关文章:
- C++ 17 个友元函数声明和内联命名空间
- 为什么 gcc 无法从其前向声明中检测到友元类命名空间?
- c++ 内联友元函数是否会导致命名空间之间的名称隐藏?
- 友元类指向不同命名空间中同名的类
- 跨命名空间的友元类和不同的.H 文件
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 匿名命名空间中模板化类的友元
- 另一个命名空间和 CRTP 中的模板友元函数
- 类内定义的友元函数的调试标志中的命名空间
- 关于友元函数定义和命名空间范围
- 将命名空间声明为类的友元
- 模板对象的模板友元函数和命名空间
- 命名空间内类的友元函数
- 为什么我的类友元函数无法访问具有命名空间的受保护成员?
- 命名空间内出现错误 C2248 友元类
- 如何在gtest中使用带有命名空间的友元类
- 哪个命名空间确实包含此友元函数的声明
- 不同命名空间中的友元运算符
- 命名空间内的友元函数声明/定义
- 具有嵌套命名空间内的友元函数的模板类