[英]“undefined reference to” operator overloading in C++
我想创建具有以下功能的类Q(有理数):
1)print():以分子/分母的形式打印有理数
2)cancel():如果可能,执行取消:(3/9 = 1/3)
3)value():有理数的值为double型;
4)运算符重载,加法,减法,除法,乘法。
这是我的代码:
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;
class Q{
private:
int num;
int denom;
public:
Q();
Q(int num,int denom);
void print();
Q cancel();
void value();
friend Q operator*(Q lhs,Q rhs);
friend Q operator/(Q lhs,Q rhs);
friend Q operator+(Q lhs,Q rhs);
friend Q operator-(Q lhs,Q rhs);
};
Q::Q(int numerator,int denominator){
num = numerator;
denom = denominator;
}
void Q::print(){
cout << to_string(num) + "/" + to_string(denom);
}
Q Q::cancel(){
vector<int> canc_val = {2,3,5,7};
while(true){
if(num % canc_val[0] == 0 && denom % canc_val[0] == 0){
num /= canc_val[0];
denom /= canc_val[0];
} else if(num % canc_val[1] == 0 && denom % canc_val[1] == 0){
num /= canc_val[1];
denom /= canc_val[1];
} else if(num % canc_val[2] == 0 && denom % canc_val[2] == 0){
num /= canc_val[2];
denom /= canc_val[2];
}else if(num % canc_val[3] == 0 && denom % canc_val[3] == 0){
num /= canc_val[3];
denom /= canc_val[3];
}else{
break;
}
}
return Q(num,denom);
}
void Q::value(){
double res;
res = num/denom;
cout << res;
}
Q operator*(Q lhs,Q rhs){
Q temp;
temp.num = lhs.num * rhs.num;
temp.denom = lhs.denom * rhs.denom;
return temp;
}
Q operator/(Q lhs,Q rhs){
Q temp;
temp.num = lhs.num * rhs.denom;
temp.denom = lhs.denom * rhs.num;
return temp;
}
Q operator+(Q lhs,Q rhs){
Q temp;
temp.num = lhs.num * rhs.denom + rhs.num*lhs.denom;
temp.denom = lhs.denom * rhs.denom;
return temp;
}
Q operator-(Q lhs,Q rhs){
Q temp;
temp.num = lhs.num * rhs.denom - rhs.num*lhs.denom;
temp.denom = lhs.denom * rhs.denom;
return temp;
}
int main(){
Q number_1(3,7);
Q number_2(3,9);
Q number_3(15,125);
number_1.print();
cout << "\n";
number_2.print();
number_2.cancel();
cout << "\n";
number_2.print();
cout << "\n";
number_3.value();
cout << "\n";
number_3.cancel();
cout << "\n";
number_3.print();
Q number_4 = number_1 + number_2;
number_4.print();
number_4.cancel();
cout << "\n";
number_4.print();
Q number_5 = number_2 - number_3;
number_5.print();
number_5.cancel();
cout << "\n";
number_5.print();
Q number_6 = number_1 * number_1;
number_6.print();
number_6.cancel();
cout << "\n";
number_6.print();
Q number_7 = number_2 / number_3;
number_7.print();
number_7.cancel();
cout << "\n";
number_7.print();
}
但是编译器抛出一个错误:
/tmp/cce4zPM4.o: In function `operator*(Q&, Q&)':
:(.text+0x170): undefined reference to `Q::Q()'
/tmp/cce4zPM4.o: In function `operator/(Q&, Q&)':
:(.text+0x1b0): undefined reference to `Q::Q()'
/tmp/cce4zPM4.o: In function `operator+(Q&, Q&)':
:(.text+0x1f0): undefined reference to `Q::Q()'
/tmp/cce4zPM4.o: In function `operator-(Q&, Q&)':
:(.text+0x230): undefined reference to `Q::Q()'
collect2: error: ld returned 1 exit status
我不知道如何解决它。 你能帮助我吗 ?
Q::Q()
没有定义,只有一个声明,但是您必须提供一个定义,如下所示:
Q::Q() :
num(0),
denom(1)
{
}
不要仅在没有初始化列表的情况下进行定义,因为这将意味着您的数据成员具有不确定的值,最终会导致未定义的行为。
发生这种情况是因为您从未实现过Q::Q()
构造函数。
幸运的是,您可以通过调用Q::Q(int, int)
来重写代码以避免使用此构造函数。
这是operator+
实现示例:
Q operator+(const Q& lhs, const Q& rhs) {
return Q(lhs.num * rhs.denom + rhs.num*lhs.denom, lhs.denom * rhs.denom);
}
请注意使用const Q&
代替Q
以避免复制对象。
考虑删除Q::Q()
构造函数,因为尚不清楚它应该代表什么数字。 也许您也可以将二元构造函数的默认分母更改为1
:
Q(int num, int denom = 1);
这样一来,您无需指定分母即可创建整数。
您还应该考虑通过从两侧划分GCD(num, denom)
来标准化构造函数中的GCD(num, denom)
。 这样可以更轻松地比较代码中的有理数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.