1

我可以操作class+class(例如我可以做date+date),但是谁能解释一下我怎么做class+class+class?C++ 不允许我定义具有 2 个参数的运算符。

4

5 回答 5

8

那是因为一般没有这样的算子。
a + b + c(a + b) + c。首先a + b,然后将结果添加到c

编辑:

如果有问题的对象非常大,以至于在表达式中创建临时a + b + c对象太昂贵,您可以谷歌搜索模板表达式;基本思想是operator+除了返回一个表达式节点之外什么都不做,稍后可以对其进行评估,作为完整表达式的一部分。

于 2013-08-13T15:02:54.043 回答
1

通过使它们成为类的朋友,您将确保它们是二元运算符,并分别定义它们,如下所示:

class someclass
{
     int a;
public:
     someclass();
     ...
     friend someclass operator+(const someclass & lhs, const someclass & rhs);
};

someclass operator+(const someclass &lhs, const someclass &rhs)
{
     someclass a = lhs;
     a.a = a.a + rhs.a;
     return a;
}

当然,您需要定义一个复制构造函数(someclass(const someclass & old);) 和该类的其他函数,但这种方法一直对我有用,我在大学时就是这样教的。

于 2013-08-13T15:03:50.077 回答
0

有两种方法可以解决这个问题。使用运算符的正常方法是,您只需创建一个普通的两个操作数运算符,然后将调用链接在一起。例如a + b + c + d=> operator+(operator+(operator+(a + b), c), d)

或者,创建您自己的命名函数或提供多参数版本的成员,使用名称准确描述其功能。

于 2013-08-13T15:04:55.933 回答
0

我建议阅读http://www.cs.rit.edu/~mjh/docs/c++-faq/operator-overloading.html

据我了解,您在这里不需要 2 个参数。您的重载需要返回一个对象,该对象是您的操作结果。在这种情况下,您的示例 class+class+class 实际上可以写为 class+(class+class) 以便首先处理 (class+class) 然后将其结果添加到第三个类。

于 2013-08-13T15:06:16.663 回答
0

您可以使用带有两个参数的算术运算符。例如:

//References are used here as arguments.
Cents operator+(const Cents &c1, const Cents &c2)
{
    // use the Cents constructor and operator+(int, int)
    return Cents(c1.m_nCents + c2.m_nCents);
}

(来源: http: //www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/

注意:如果您需要在其中使用类的私有成员,则需要在类定义中将运算符“函数”声明为友元。

如果然后返回与作为参数给出的类类型相同的类类型(对象或它们的引用,如here),则可以执行class + class + class ...,假设每个operator +调用都在2个参数之间,并添加结果到第三个再次调用运算符+“函数”等。

于 2013-08-13T15:06:57.467 回答