[英]“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.