Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符+=和两个类_C++_Operator Overloading_Overloading - Fatal编程技术网

C++ 重载运算符+=和两个类

C++ 重载运算符+=和两个类,c++,operator-overloading,overloading,C++,Operator Overloading,Overloading,我有两个类,让我们称它们为A和B。我在类A中重载了运算符+=现在我想做这样的事情: A += B + B + B 类B没有重载运算符+,这是一个问题,因为求值是从右到左的,它希望将所有的B相加,然后将+=结果加到a。 有没有什么方法可以在不重载B类运算符+的情况下实现我的目标 有没有什么方法可以在不重载B类运算符+的情况下实现我的目标 一句话,不 A::operator+=将B作为输入,因此如果您希望A+=B+B+B工作,您需要一种将B对象添加到一起的方法,以生成一个新的B+=可以作为输入,而

我有两个类,让我们称它们为A和B。我在类A中重载了运算符+=现在我想做这样的事情:

A += B + B + B
类B没有重载运算符+,这是一个问题,因为求值是从右到左的,它希望将所有的B相加,然后将+=结果加到a。 有没有什么方法可以在不重载B类运算符+的情况下实现我的目标

有没有什么方法可以在不重载B类运算符+的情况下实现我的目标

一句话,不

A::operator+=将B作为输入,因此如果您希望A+=B+B+B工作,您需要一种将B对象添加到一起的方法,以生成一个新的B+=可以作为输入,而这正是operator+的用途。

这是可能的

不必重载加法运算符,您可以使B隐式地与算术类型转换。一个演示,根据要求不需要为B重载运算符+,但允许您希望的精确表达式:

struct B {
    B() = default;

    // this constructor makes B convertible from int
    B(int){}

    // this operator makes B convertible to int
    operator int() {
        return 42;
    }
};


struct A {
    A& operator+=(const B&) {
        return *this;
    }

    // alternative:
    // if you use this, then B does not need to convert from int
    // A& operator+=(int)
};

int main() {
    A A;
    B B;
    A += B + B + B;
}

A+=B;A+=B;A+=B;?不需要重载运算符+似乎是一种任意限制。我建议你考虑这是否重要。+=右到左关联,所以你不能做一个像+= B+= B+= B的东西,因为它被解析为+= B+= B+= B,但是如果你写的东西像IoSokes,你能做一个+= B+= B+= B吗?我真的不能修改转录。所以处理这个问题的唯一方法是为类B实现操作符+。