Skip to content

C++ ADT 定义示例

使用 C++ 定义分数类型 Frac,包含分子和分母两个整数成员,以及构造函数、析构函数、赋值函数、加法函数、减法函数、乘法函数、除法函数、输出函数等。

cpp
#include <iostream>
using namespace std;

// 定义简易的错误类型
const char* const ZeroError = "DevidedByZeroError";

// 最大公约数快速异或算法
inline int gcd(int a, int b) {
    while (b ^= a ^= b ^= a %= b)
        ;
    return a;
}

// 有理数类
class Frac {
    int m_p, m_q;
    // 输入和输出定义为友元
    friend ostream& operator<<(ostream& stream, const Frac& frac);
    friend istream& operator>>(istream& stream, Frac& frac);

   public:
    Frac(int p, int q)
        : m_p(p), m_q(q) {
        // 如果分母为零报错
        if (m_q == 0)
            throw ZeroError;
        int gcdVal = gcd(m_p, m_q);
        // 此处约分
        if (gcdVal != 1 && gcdVal != -1) {
            m_p = m_p / gcdVal;
            m_q = m_q / gcdVal;
        }
        // 由最简定义得,分母不为负数
        if (m_q < 0) {
            m_p = -m_p;
            m_q = -m_q;
        }
    }
    ~Frac() {}
    // 实现加减乘除
    const Frac operator+(const Frac& frac) const;
    const Frac operator-(const Frac& frac) const;
    const Frac operator*(const Frac& frac) const;
    const Frac operator/(const Frac& frac) const;
    // 获取分子
    int getNumerator() {
        return m_p;
    }
    // 获取分母
    int getDenominator() {
        return m_q;
    }
};

// 加法实现
const Frac Frac::operator+(const Frac& frac) const {
    return Frac(frac.m_p * m_q + m_p * frac.m_q, frac.m_q * m_q);
}

// 减法实现
const Frac Frac::operator-(const Frac& frac) const {
    return Frac(m_p * frac.m_q - m_q * frac.m_p, frac.m_q * m_q);
}

// 乘法实现
const Frac Frac::operator*(const Frac& frac) const {
    return Frac(m_p * frac.m_p, m_q * frac.m_q);
}

// 除法实现
const Frac Frac::operator/(const Frac& frac) const {
    return Frac(m_p * frac.m_q, m_q * frac.m_p);
}

// 输出实现
ostream& operator<<(ostream& stream, const Frac& frac) {
    stream << "(" << frac.m_p << " / " << frac.m_q << ")";
    return stream;
}

// 输入实现
istream& operator>>(istream& stream, Frac& frac) {
    // 通过构造函数化简
    int p, q;
    stream >> p;
    stream >> q;
    // 构造一个新的临时对象以便约分、化简
    Frac temp = Frac(p, q);
    frac.m_p = temp.m_p;
    frac.m_q = temp.m_q;
    return stream;
}

int main() {
    Frac* fra1 = new Frac(2, 3);
    Frac* fra2 = new Frac(2, 8);
    cout << (*fra1 + *fra2) << endl;
    cout << (*fra1 - *fra2) << endl;
    cout << (*fra1 * *fra2) << endl;
    cout << (*fra1 / *fra2) << endl;
    cout << fra2->getDenominator() << endl;
    cout << fra2->getNumerator() << endl;
    Frac fra3(1, 2);
    cin >> fra3;
    cout << fra3 << endl;
    delete fra1;
    delete fra2;
    return 0;
}