在CPP文件错误中重新定义类

时间:2014-04-27 03:16:34

标签: c++ class

我知道有很多这样的问题,但我找不到适合我的解决方案。

好吧,我正在尝试制作简单的分数计算器,而不是添加或减去任意数量的函数,并将答案写成减少的分数。

示例:input = 3/2 + 4 / 8 ,输出= 2

我正在尝试重载运算符以实现此目的。

所以在程序中,我正在尝试开发输入,其中包含由运算符'+'或' - '分隔的分数表达式。

表达式中的分数数是任意的。

以下6行中的每一行都是有效输入表达式的示例:

1/2 + 3/4
1/2 -5/7+3/5
355/113
3    /9-21/    -7
4/7-5/-8
-2/-3+7/5

我遇到的问题是,当我运行主CPP程序时,它有一个类重新定义错误:

fraction.cpp:6:7: error: redefinition of 'Fraction'
class Fraction
      ^
./Fraction.h:7:7: note: previous definition is here
class Fraction{

但是,这应该不是问题,因为我在头文件中声明了类和成员函数,并在我的CPP文件中定义它们。

我的以下代码如下:

标题文件

#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;


class Fraction{

    public: 
    Fraction(int , int );
    int fraction(int,int);
    void reduce_fraction(int *,  int *);
    Fraction& operator+(const Fraction& n);
    Fraction& operator-(const Fraction& n);
    friend ostream& operator<<(ostream &os, const  Fraction& n);
    friend istream& operator>>(istream &is, const Fraction& n);


};
#endif

CPP档案

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

class Fraction
{
public: 
    Fraction::Fraction(int a, int b);
    int find_gcd(int n1, int n2); 

    void reduce_fraction(int *nump,  int *denomp) 
    {
      int gcd;   
      gcd = find_gcd(*nump, *denomp);
      *nump = *nump / gcd;
      *denomp = *denomp / gcd;

      if ((*denomp<0 && *nump < 0 ))
    {
        *denomp*=-1;
        *nump*=-1;
    }
    else if (*denomp < 0 &&  *nump >0){
        *denomp*=-1;

    }
if ( *denomp ==0) {
        throw invalid_argument( "Error: zero denominator" );
    }
    }



Fraction& Fraction::operator+(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) + (n.denom * n.nump);
    return Fraction(numera,denom);

}

Fraction& Fraction::operator-(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) - (n.denom* n.nump);
    return Fraction(numera, denom);
}

friend ostream& operator<<(ostream &os, Fraction& n)
{
    if (n.numera == 0)
    {
        cout << 0 << endl;
        return os;
    }
    else if (n.numera == n.denom)
    {
        cout << 1 << endl;
        return os
    }
    else
    {
        cout << n.numera << '/' << n.denom << endl;
        return os;
    }
}

friend istream& operator>>(istream &os, Fraction& n)
{
    char slash = 0;
    return is >> n.numera >> slash >> n.denom;

    }
};


















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

class Fraction
{
public: 
    Fraction::Fraction(int a, int b);
    int find_gcd(int n1, int n2); 

    void reduce_fraction(int *nump,  int *denomp) 
    {
      int gcd;   
      gcd = find_gcd(*nump, *denomp);
      *nump = *nump / gcd;
      *denomp = *denomp / gcd;

      if ((*denomp<0 && *nump < 0 ))
    {
        *denomp*=-1;
        *nump*=-1;
    }
    else if (*denomp < 0 &&  *nump >0){
        *denomp*=-1;

    }
if ( *denomp ==0) {
        throw invalid_argument( "Error: zero denominator" );
    }
    }



Fraction& Fraction::operator+(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) + (n.denom * n.nump);
    return Fraction(numera,denom);

}

Fraction& Fraction::operator-(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) - (n.denom* n.nump);
    return Fraction(numera, denom);
}

friend ostream& operator<<(ostream &os, Fraction& n)
{
    if (n.numera == 0)
    {
        cout << 0 << endl;
        return os;
    }
    else if (n.numera == n.denom)
    {
        cout << 1 << endl;
        return os
    }
    else
    {
        cout << n.numera << '/' << n.denom << endl;
        return os;
    }
}

friend istream& operator>>(istream &os, Fraction& n)
{
    char slash = 0;
    return is >> n.numera >> slash >> n.denom;

    }
};

主要CPP文件

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

int main()
{
  Fraction x(2,3);
  Fraction y(6,-2);

  cout << x << endl;
  cout << y << endl;

  cin >> y;
  cout << y << endl;
  Fraction z = x + y;
  cout << x << " + " << y << " = " << z << endl;
}

我基本上无法理解为什么我会收到先前的定义错误以及如何解决它。另外,如果您在此计划中看到我的实施有任何其他问题,我将非常感谢您告诉我!

非常感谢!

1 个答案:

答案 0 :(得分:1)

Fraction.cpp中定义成员函数的方法不是这样的:

class Fraction
{
public: 
  void reduce_fraction(int *nump,  int *denomp) 
  {
    ...
  }
}

但是喜欢这样:

void Fraction::reduce_fraction(int *nump,  int *denomp) 
{
  ...
}

更一般地说,在测试任何代码之前,不应该编写这么多代码。