struct Fraction {
int numerator;
int denominator;
Fraction() {}
Fraction(int numerator, int denominator) :
num(numerator),
den(denominator)
{}
}; // Fraction
class FractionWithGCD {
private:
Fraction m_fraction;
int m_gcd;
public:
FractionWithGCD(); // Default
FractionWithGCD(int numerator, int denominator);
FractionWithGCD(Fraction& fraction);
int getGCD() const { return m_gcd; }
Fraction getFraction() const { return m_fraction; }
void calculateGCD(int numerator, int denominator);
void calculateGCD(Fraction& fraction);
private:
void calculate(int numerator, int denominator);
}; // FractionWithGCD
// -------------------------------------------------------------------------
// FractionWithGCD() - Default Constructor
// User needs to use either calculateGCD function they will both create member
// variable fraction and calculate the GCD of that fraction storing the values.
FractionWithGCD::FractionWithGCD() :
m_gcd(0) {
} // FractionWithGCD
// -------------------------------------------------------------------------
// FractionWithGCD() - Takes Two Integers - Will construct a fraction
// variable and calculate the GCD upon construction
FractionWithGCD::FractionWithGCD(int numerator, int denominator) :
m_gcd(0) {
calculate(numerator, denominator);
} // FractionWithGCD
// -------------------------------------------------------------------------
// FractionWithGCD() - Takes a Fraction struct, saves it and calculates the GCD.
FractionWithGCD::FractionWithGCD(Fraction& fraction) :
m_gcd(0) {
calculate(fraction.numerator, fraction.denominator);
} // FractionWithGCD
// -------------------------------------------------------------------------
// calculateGCD() - Calls private member calculate() - If this function is called
// again, the current fraction and GCD will be overwritten.
void FractionWithGCD::calculateGCD(int, numerator, int denominator) {
calculate(numerator, denominator);
} // calculateGCD
// -------------------------------------------------------------------------
// calculateGCD() - Calls private member calculate() - If this function is called
// again, the current fraction and GCD will be overwritten.
void FractionWithGCD::calculateGCD(Fraction& fraction) {
calculate(fraction.numerator, calculate.denominator);
} // calculateGCD
// -------------------------------------------------------------------------
// calculate() - Private Method - Responsible For Checking If Fraction Is
// Valid That The Denominator Is Not 0, Saved The Fraction To Member Variable
// And Does All The Work To Calculate The GSD And Saves It Into Member Variable
void FractionWithGCD::calculate(int numerator, int denominator) {
// Check Denominator For 0 To Prevent Possible Division By 0
if (denominator == 0) {
std::cout << "Error: Division By 0." << std::endl;
return;
}
// Save Our Fraction
m_fraction.numerator = numerator;
m_fraction.denominator = denominator;
// Temp Stack Variables To Work With
int remainder = 0;
do {
remainder = numerator % denominator;
numerator = denominator;
denominator = remainder;
} while (denominator > 0);
m_gcd = numerator;
} // Calculate
为什么'fract'类成员?你是否想每次调用'gcd'或同一个函数时都返回一个新的'fract'? –
你的代码不能编译,你需要使用'fraction * Worker :: gcd(fraction * f)'而不是'fraction Worker :: * gcd(fraction * f)'。另外,谁会为'fraction *'成员释放内存?你需要一个析构函数来删除内存。 – vsoftco
谢谢。我后来在解决分数和分形的程序中进行了解构。我计划使用其他函数的指针 –