C ++我需要重载哪些运算符才能使这个A1 + = A2 * floatValue工作?

时间:2016-04-18 21:00:09

标签: c++

我需要重载哪些运算符才能生成这个词?

类型A的变量A1和A2,变量floatValue的类型为float。

A1 += A2 * floatValue;

我重载了这个操作符

A operator+() const;
A operator+=(const A value);
A operator*(const A value);
friend A operator*(const A val2, float val);

但是,我收到错误" A类没有合适的复制构造函数"

我在班上有这个构造函数

A();
A(float val1, float val2);
A(float value);

感谢您的回答。

3 个答案:

答案 0 :(得分:3)

最小例子:

    #include <iostream>
using namespace std;

struct foo {
    float val;

    foo(float val): val(val){}

    foo &operator+=(foo const &other) {
        this->val += other.val;
        return *this;
    }

    friend foo operator*(foo const &lhs, foo const &rhs) {
        return lhs.val*rhs.val;
    }
};

int main() {
    foo a = 5, b = 6;
    a += b * 3;
    cout << a.val << endl;
    return 0;
}

请参阅:http://ideone.com/6pD2pr

使用显式构造函数,您可能希望使用此示例:

#include <iostream>
using namespace std;

struct foo {
    float val;
    explicit foo(float val): val(val){}

    foo &operator+=(foo const &other) {
        this->val += other.val;
        return *this;
    }

    friend foo operator*(foo const &lhs, float val) {
        return foo(lhs.val*val);
    }
};

int main() {
    foo a(5), b(6);
    a += b * 3;

    cout << a.val << endl;
    return 0;
}

请参阅:http://ideone.com/o8Vu1d

答案 1 :(得分:2)

每当你重载像

这样的赋值运算符时
A operator+=(const A value);

您还需要定义一个像

这样的复制构造函数
A( const A& );

复制构造函数将由赋值运算符使用。

这是所谓的三规则的一部分。

答案 2 :(得分:0)

当你有这样的功能时:

fun(A a);

此处的参数按值传递,因此您需要为A创建复制构造函数(以便从另一个实例创建新实例),或者您可以将其更改为引用,因此不需要复制构造函数。 像这样:

A operator+=(const A &value);