2015-01-31 95 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

相关问题