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

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在你的代码中)?

顺便说一句,如果我在我的代码中遇到了这么多朋友函数的需求,它会让我再次思考我的设计,很难; 我认为这是我做错事的一个标志.

  • 一个很好的理由是进行测试.有时,如果能够访问私有成员,则编写测试会更容易.有些人认为这很糟糕,因为它违反了"黑匣子"测试原则,但在实践中有些情况下最好进行"白盒"测试. (5认同)
  • “这将构成“安全漏洞”,” - 在这种情况下,谁是攻击者?开发商?你正在对程序员采取防御措施,他们被认为是先验的愚蠢? (4认同)
  • @Tomis注意引号.但是,如果你不认为私有数据需要保护不受类设计者意图的修改,为什么不首先强制公开所有内容并完全摆脱`private`和`protected`? (3认同)
  • @Tomis IOW,Python。但我会选择 C++ 编译时安全性,而不是 Python 的“假设我们都知道其他人的意图”。我认为我们应该在这一点上达成共识。 (2认同)

alf*_*lfC 5

如果你将你的命名空间提升为一个类,你可以一次将许多函数作为友元。它带有(许多)其他缺点,但您实际上可能想要 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)