簡體   English   中英

C ++中“未定義的引用”運算符重載

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM