gpt4 book ai didi

c++ - C++ 运算符重载失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:22 25 4
gpt4 key购买 nike

我如下定义了一个 Fraction 类,重载了“=”和“+”运算符。

我使这个程序尽可能简单以显示问题。

#include <iostream>

class Fraction {
private:
int nominator;
int denominator;
public:
Fraction ();
Fraction (int, int);

Fraction & operator = (Fraction &);

friend Fraction operator + (Fraction &, Fraction &);

// static function:
// find the Greatest Common Divisor of two numbers
int static GCD(int x, int y);

};

int Fraction::GCD(int x, int y) {
if (y == 0) {
return x;
} else {
return GCD (y, x % y);
}
}

Fraction::Fraction () {
nominator = NULL;
denominator = NULL;
}

Fraction::Fraction (int num_1, int num_2) {
int divisor = Fraction::GCD (num_1, num_2);
nominator = num_1 / divisor;
denominator = num_2 / divisor;
}

Fraction & Fraction::operator = (Fraction &A) {
nominator = A.nominator;
denominator = A.denominator;
return *this;
}

Fraction operator + (Fraction &A, Fraction &B) {
int nominator = A.nominator * B.denominator + B.nominator * A.denominator;
int denominator = A.denominator * B.denominator;
int divisor = Fraction::GCD (nominator, denominator);
return Fraction (nominator / divisor, denominator / divisor);
}

在 Main() 函数中,我有三个测试用例

int main(int argc, const char * argv[]) {

Fraction frac_a = Fraction(1, 3);
Fraction frac_b = Fraction(1, 4);

// test 1: no compile error
frac_a + frac_b;
frac_a = frac_b;

// test 2: no compile error
Fraction frac_c = frac_a + frac_b;

// test 3: Error: No viable overloaded '='
Fraction frac_d;
frac_d = frac_a + frac_b;

return 0;
}

问题是,为什么“测试 3”出现“No viable overloaded '='”错误?

最佳答案

您的赋值运算符被声明为引用非常量 Fraction。您的加法运算符按值返回,因此您试图将临时分配给 frac_c。临时对象不能绑定(bind)到非常量引用。

解决方法是让你的赋值运算符通过 const-reference 获取:

Fraction & operator = (const Fraction &);

关于c++ - C++ 运算符重载失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com