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

我想知道是否有一种方法,使我们在一个特定的命名空间的朋友中定义一个类的所有功能

特别是,我有一个类,例如:

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)呢?

除此之外,如果我在代码中遇到了这么多朋友的功能,那么会让我再想想我的设计,我会把它作为一个迹象,我在做错事.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...