2014-10-30 61 views
0

我有一个名为Fraction的类,我试图在屏幕上打印它们之前减小分数。我有一个名为redue()的函数试图做到这一点,但不知何故,这不管用。下面是我有:
获取一个错误,但不明白为什么

// Fraction.cpp 
// Implemenation for Fraction header file 
// 

#include <iostream> 
#include <iomanip> 
#include "Fraction.h" 
#include <stdexcept> 
using namespace std; 


// Constructor: empty 
Fraction:: Fraction(void) {} 

// Construcotr: Intializing numerator and denomenator 
Fraction:: Fraction(int a, int b) 
{ 
    if (b == 0) 
    { 
     throw invalid_argument("Error: division by zero"); 
    } 

    if(b != 0) 
    { 
     reduce(a,b); 
     setNumo(a); 
     setDeno(b); 
    } 
} 

// Overloading operators 
ostream &operator<<(ostream &output, const Fraction &fraction) 
{ 
    if(fraction.numo == fraction.deno) 
    { output<<1; 
     return output; } 

    if (fraction.deno == 1) 
    { output <<fraction.numo; 
     return output;} 

    if((fraction.numo >=0) && (fraction.deno > 0)) 
    { 
     output <<fraction.numo <<"/"<<fraction.deno; 
     return output; // prints a/b 
    } 

} 

// insertion operator overloading 
istream &operator>>(istream &input, Fraction &fraction) 
{ 
    int n1,n2; 
    input >> n1; 
    input >> fraction.ch; 
    input >> n2; 

    Fraction temp(n1, n2); 
    fraction.numo = temp.numo; 
    fraction.deno = temp.deno; 
    return input; 
} 

// = operator 
const Fraction& Fraction::operator=(const Fraction &f) 
{ 
    numo = f.numo; 
    deno = f.deno; 
    return *this; 
} 

Fraction Fraction::operator-(const Fraction &fraction) const { 
    Fraction temp; 
    int numo1, numo2; 
    temp.numo = numo * fraction.deno - fraction.numo * deno; 
    temp.deno = deno * fraction.deno; 
    Fraction::reduce(temp.numo, temp.deno); 
    return temp; 
} 

Fraction Fraction::operator+(const Fraction &fraction) const { 
    Fraction temp; 
    temp.numo = numo * fraction.deno + fraction.numo * deno; 
    temp.deno = deno * fraction.deno; 
    Fraction::reduce(temp.numo, temp.deno); 
    return temp; 
} 







void Fraction:: setNumo(int a) 
{ numo = a; } 

void Fraction:: setDeno(int b) 
{ deno = b; } 


static void Fraction::reduce(int &num1, int &num2) 
{ 
    int gcd; 
    gcd = find_gcd(num1, num2); 

    if(num2 != 0) 
    { 
     num1 = num1/gcd; 
     num2 = num2/gcd; 
    } 
} 



int Fraction::find_gcd(int num1, int num2) // returns gcd of two numbers 
{ 
    int gcd, remainder; 
    remainder = num1 % num2; 
    while(remainder !=0) 
    { 
     num1 = num2; 
     num2 = remainder; 
     remainder = num1 % num2; 
    } 
    gcd = num2; 
    return gcd; 
} 

这里是我的错误,当我尝试编译该文件:

Fraction.cpp:102:50: error: cannot declare member function ‘static void Fraction::reduce(int&, int&)’ to have static linkage [-fpermissive] 
static void Fraction::reduce(int &num1, int &num2) 
               ^
Fraction.cpp: In static member function ‘static void Fraction::reduce(int&, int&)’: 
Fraction.cpp:105:30: error: cannot call member function ‘int Fraction::find_gcd(int, int)’ without object 
    gcd = find_gcd(num1, num2); 

有人能告诉我是什么问题以及如何我可以修复这个问题?我真的需要帮助。先谢谢你。

+0

我真的需要帮助。 – 2014-10-30 06:00:53

回答

0
static void Fraction::reduce(int &num1, int &num2) 
{ 
    int gcd; 
    gcd = find_gcd(num1, num2); <<<<<<<<<<This is a member function 

    if(num2 != 0) 
    { 
     num1 = num1/gcd; 
     num2 = num2/gcd; 
    } 
} 

当你声明的功能的静态编译器不会插入该指针在函数调用,这意味着你不能直接调用任何其他成员函数,静态函数中也不能使用类的数据成员。

0

我觉得你的两个错误信息是很清楚的:

Fraction.cpp:102:50: error: cannot declare member function ‘static void Fraction::reduce(int&, int&)’ to have static linkage [-fpermissive] 
static void Fraction::reduce(int &num1, int &num2) 

这意味着你已经声明Fraction::reduce(int, int)作为一个成员函数(大概在Fraction.h),但现在,当你实现它,你”重新尝试使其变为静态。删除static,这将是罚款。

Fraction.cpp: In static member function ‘static void Fraction::reduce(int&, int&)’: 
Fraction.cpp:105:30: error: cannot call member function ‘int Fraction::find_gcd(int, int)’ without object 
    gcd = find_gcd(num1, num2); 

这从第一个错误开始流动。 C++中的成员函数是类型的函数,而不是该类型的实例。您已将reduce设为静态,但find_gcd为非静态。所以reduce正在作为一个类函数执行,没有this指针;当它调用find_gcd时,它不知道Fraction的哪个实例用作this指针。制作reduce非静态也会解决这个问题。

相关问题