2015-05-06 77 views
-3

我想写一个函数,返回一个新的动态分配 结构指针,我遇到了返回指针的问题。 我已经得到这个工作,如果我只是返回一个结构。但我无法弄清楚如何传回分数。任何帮助都会很棒。C++结构函数,返回一个新的结构,动态分配并接受一个结构

struct fraction 
{ 
    int n; 
    int d; 
    int gcd = 0; 
}; 

class Worker 
{ 
private: 
    fraction * fract = new fraction; 

public: 

    Worker(); 
    // prototypes 
    fraction* gcd(fraction *); 
}; 

fraction Worker:: *gcd(fraction *f) 
{ 


    int n= f->n; 
    int d = f->d; 
    int r = 0; 
    do 
    { 
     r = n % d; 
     n = d; 
     d = r; 
    } while (d > 0); 
    fract->d = f->d; 
    fract->n = f->n; 
    fract->gcd = n; 

    return fract; 

} 
+0

为什么'fract'类成员?你是否想每次调用'gcd'或同一个函数时都返回一个新的'fract'? –

+0

你的代码不能编译,你需要使用'fraction * Worker :: gcd(fraction * f)'而不是'fraction Worker :: * gcd(fraction * f)'。另外,谁会为'fraction *'成员释放内存?你需要一个析构函数来删除内存。 – vsoftco

+0

谢谢。我后来在解决分数和分形的程序中进行了解构。我计划使用其他函数的指针 –

回答

0
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 
+0

如果你需要动态内存,你可以创建这个类的一个实例,并将它存储到一个std :: share_ptr或std :: unique_ptr中以满足你的需求。我只会使用新的或删除的项目,如果项目是短暂的,并且您知道您将是唯一一个删除项目的事实。如果您不确定另一个调用者或用户是否要删除它,则在多个对象需要时共享是安全的,或者如果它仅属于一个对象,则是唯一的。 –