我有一个类是这样的:

class A {
    ...private functions, variables, etc...
public:
    ...some public functions and variables...

    A operator * (double);
    A operator / (double);
    A operator * (A);
    ...and lots of other operators
}

不过,我想也可以做的东西一样2 * A,而不是只被允许做A * 2,所以我需要这样的外部类的功能:

A operator * (double, A);
A operator / (double, A);
...etc...

我应该把所有这些运营商以外的类的一致性,或者我应该保持半内,外一半?

有帮助吗?

解决方案

所以你说的是,因为你必须把一些运营商(没有A作为第一个参数的那些)的类外,也许你应该把它们放在那里让人们知道在哪里可以找到他们呢?我不认为如此。我希望找到里面的类运营商,如果在所有可能的。当然,把“外”的人在同一个文件,这将有助于。如果外面的人需要访问私有成员变量,然后加入friend线是一个巨大的暗示对于那些运营商的文件中的其他地方寻找。

我会走得很远,甚至包括我的,如果实施的经营者实际上可能与公共getter和setter方法来完成的friend线?我想我会的。我认为这些运营商为真正作为类的一部分。这只是语言的语法要求他们是自由的功能。所以一般我用friend,我写他们,好像他们是成员函数,没有使用getter和setter。这是一个令人愉快的副作用所产生的需要friend语句会导致他们都在类的定义中列出。

其他提示

IMHO,值得关注的不应该与文体的一致性,但封装的一致性;通常如果一个函数不需要访问私有成员,它不应该是类的一部分。这不是一个硬性的快治,看到它这里

参数

所以,如果你的运营商不需要专用通道,把它们放在外面。否则,它们将必须是内部像这样:

class A {
    ...
public:
    ...
    A operator * (double);
    A operator / (double);
    friend A operator * (double, A);
    friend A operator / (double, A);
    ...
};

从你的答复中的问题的意见看来,你必须从doubleA在类的隐式转换。是这样的:

class A
{
    // ...
public:
    A(double);

    // ...
};

在此情况下,可以简单地定义一个自由功能的形式的每个操作者:

A operator*( const A&, const A& );

和如果任何一方是A对象,而另一侧是隐式转换为一个A它将被使用。由于这个原因,通常优选的是使对称二元运算自由功能。

常见它可以是更容易实现在分配版本*方面二进制*=。在这种情况下,我会使得分配版本的成员函数,并定义为*类似:

A operator*( const A& l, const A& r )
{
    A result(l);
    result += r;
    return result;
}

否则为operator*是您的类显然是部分界面我就没有问题,如果需要,使其成为一个friend

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top