繁体   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