我可以操作class + class(例如我可以做日期+日期),但任何人都可以解释我怎样才能上课+课+课? C ++不允许我用2个参数定义运算符。
答案 0 :(得分:6)
那是因为一般没有这样的操作员
a + b + c
是(a + b) + c
。首先是a + b
,然后是结果
其中添加了c
。
编辑:
如果有问题的对象非常大,那么创建
像a + b + c
这样的表达式中的临时表也是如此
贵,你可以google模板表达;基础的
我的想法是operator+
除了返回之外什么都不做
表达式节点,可以在以后进行评估,作为其中的一部分
完整的表达。
答案 1 :(得分: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);)以及该类的其他函数,但是这个方法对我来说一直很有用,这就是我的教学方式学院。
答案 2 :(得分:0)
有两种方法可以解决这个问题。运算符的常规方法是,您只需创建一个普通的两个操作数运算符,然后将调用链接在一起。例如a + b + c + d
=> operator+(operator+(operator+(a + b), c), d)
。
或者,创建您自己的命名函数或提供多参数版本的成员,使用该名称准确描述它的作用。
答案 3 :(得分:0)
我建议阅读http://www.cs.rit.edu/~mjh/docs/c++-faq/operator-overloading.html
据我所知,此处不需要2个参数。您的重载需要返回一个操作结果的对象。在这种情况下,您的示例类+ class + class实际上可以写为class +(class + class),以便首先处理(class + class),然后将结果添加到第三个类中。
答案 4 :(得分: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/)
注意:如果您需要在其中使用类的私有成员,则需要在类定义中将运算符“function”声明为 friend 。
如果你然后返回一个类型与那些作为参数给出的类型(这里的对象或引用),你可以做class + class + class ...,假设每个operator +调用都在2个参数之间,并且结果被添加到第三个,再次调用operator +“function”等。