在c ++中只有静态成员函数的朋友类作为朋友模块?

时间:2014-10-09 15:00:50

标签: c++ module encapsulation

我有一个类(比如MyClass)和将MyClass实例作为参数的函数。 这些函数需要访问MyClass的私有成员。 成员是私人的,因为MyClass的用户不需要了解成员。 但是,我不想让函数成为MyClass的成员,因为函数应该将几个MyClass实例作为参数,并且对称地处理争论。我不想交易"这个"特别反对。

如果有一种模块系统,所以我可以声明一个包含MyClass朋友的功能的模块,我会很高兴。但是C ++中没有这样的东西。 一种方法是创建一个友元类,并使函数成为类的静态成员。但是,很多人并不推荐这种方式(例如Namespace + functions versus static methods on a class)因为课程不适合这种用途。

针对此案例的任何设计解决方案?

3 个答案:

答案 0 :(得分:2)

命名空间是当前相关的功能。但是不可能获得朋友命名空间,不再可以模板化命名空间或将命名空间作为模板参数传递,两种常见的情况是只有静态成员的struct通常用作解决方法。因此,使用结构有一个很好的先例。使用静态成员结构而不是命名空间至少还有另一个原因:当结构关闭时,命名空间可以添加。而这一方面本身也可能是为朋友使用结构而不是命名空间的理由。

答案 1 :(得分:1)

您通常会实现作为目标类成员的独立函数等函数。你可以实现它们"字面意思"在课堂上,但他们仍然是独立的。因此,当您将所有这些功能列为朋友并实施时,您不需要重复自己:

class MyClass {
    int x;

    friend void doSomething(MyClass & obj) {
        obj.x++;
    }
    friend bool doSomethingDifferent(MyClass & a, MyClass & b) {
        return a.x < b.x;
    }
};

答案 2 :(得分:0)

朋友不必上课。您可以将函数声明为朋友。