2015-01-31 88 views
0

在我的任務中,我需要從一個公共函數(set(int,int))調用一個私有函數(簡化)。當我嘗試編譯時,我收到一個錯誤,說重新定義集合。我不知道我做錯了什麼,或錯誤的含義。很感謝任何形式的幫助。這裏是我有:使用公共函數調用私有函數

//Fraction.h 

struct Fraction{ 
    private: 
      int numerator; 
      int denonminator; 
      void simplify(); 

    public: 
      void set(int n, int d){void simplify();}; 
      void display() const; 
}; 

//Fraction.cpp 

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

void Fraction::set(int n, int d){ 
    numerator = n; 
    denonminator = d; 
    simplify(); 
} 

void Fraction::simplify(){ 
    int i; 
    for (i = denonminator * numerator; i > 1; i--){ 
      if(denonminator % i == 0 && numerator % i == 0){ 
        numerator = numerator/i; 
        denonminator = denonminator/i; 
       } 
     } 
} 

void Fraction::display() const{ 
     cout << numerator << "/" << denonminator; 
} 

回答

1

您所定義設置兩次..更好申報一次

struct Fraction{ 
    private: 
      int numerator; 
      int denonminator; 
      void simplify(); 

    public: 
      // Dont use this-- void set(int n, int d){void simplify();}; //Defined here once 
      void set(int n, int d); //Just declare it 
      void display() const; 
}; 

//Fraction.cpp 

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

void Fraction::set(int n, int d){//Defined it again 
    numerator = n; 
    denonminator = d; 
    simplify(); 
} 

void Fraction::simplify(){ 
    int i; 
    for (i = denonminator * numerator; i > 1; i--){ 
      if(denonminator % i == 0 && numerator % i == 0){ 
        numerator = numerator/i; 
        denonminator = denonminator/i; 
       } 
     } 
} 
+0

謝謝,現在一切都合情合理! – thG 2015-01-31 21:33:56

2

Fraction::set實現兩次:你已經實現了它在頭 - 在.cpp文件中再次實現它。

你必須決定一個實現。

在看什麼都做的實現,你應該改變標題閱讀

//... 
void set(int n, int d); 
//... 
+0

感謝現在有道理! – thG 2015-01-31 21:30:34

2

您定義set兩次:

struct Fraction{ 
    void set(int n, int d){void simplify();}; // <== #1 
}; 

And:

void Fraction::set(int n, int d) { // <== #2 
    numerator = n; 
    denonminator = d; 
    simplify(); 
} 

的第一個定義並沒有你想要的要多 - 這不是叫simplify,聲明它的命名simplify的本地函數,它沒有參數和返回void - 這無關與Fraction::simplify。所以只需更換它:

void set(int n, int d); 
+0

你確定*第一個定義是無效的嗎?它看起來[包含一個完全有效的函數聲明](https://ideone.com/yrOqZs)給我... – 2015-01-31 21:24:36

+0

@ gha.st我的意思是無效的OP意圖做什麼 - 我澄清。 – Barry 2015-01-31 21:28:30

+0

我確實定義了兩次,現在有意義。非常感謝 – thG 2015-01-31 21:28:45

相關問題