如何在C ++中的不同文件中声明类?

时间:2018-10-10 21:51:16

标签: c++ class

我刚刚了解到,只要在main.cpp中声明函数并使用g++ main.cpp message.cpp对其进行编译,就可以在与main.cpp不同的文件中定义函数。

但是,如果我想在除main.cpp之外的单独文件中定义类,该怎么办?它似乎不起作用,并且我不知道在单独的文件中定义该类时在main.cpp中声明什么。谢谢。


编辑:

这是main.cpp代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
  int a, b;
  string str;
  Fraction fract;
  while (true) {
    cout << "Enter numerator: ";
    cin >> a;
    cout << "Enter denumerator: ";
    cin >> b;
    fract.set(a, b);
    cout << "Numerator is " << fract.get_num()
     << endl;
    cout << "Denumerator is " << fract.get_den()
     << endl;
    cout << "Do it again? (y or n) ";
    cin >> str;
    if (!(str[0] == 'y'))
      break;
  }
  return 0;
}

这是Fraction.cpp

#include <cstdlib>

class Fraction {
private:
  int num, den;
public:
  void set(int n, int d) {
    num = n;
    den = d;
    normalize();
  }
  int get_num() {
    return num;
  }
  int get_den() {
    return den;
  }
private:
  void normalize() {
    if (den == 0 || num == 0) {
      num = 0;
      den = 1;
    }
    if (den < 0) {
      num *= -1;
      den *= -1;
    }
    int n = gcf(num, den);
    num = num / n;
    den = den / n;
  }
  int gcf(int a, int b) {
    if (b == 0)
      return abs(a);
    else
      return gcf(b, a%b);
  }
  int lcm(int a, int b) {
    int n = gcf(a, b);
    return a / n * b;
  }
};

但是我无法使用g++ main.cpp Fraction.cpp进行编译。


Edit2:

它给了我错误:

main.cpp: in function 'int main()':
main.cpp:8:3: error: 'Fraction' was not declared in this scope
main.cpp:14:15: 'fract' was not declared in this scope

1 个答案:

答案 0 :(得分:2)

我将创建一个包含您的课程的Fraction.h文件

#ifndef FRACTION_H
#define FRACTION_H

class Fraction {
private:
  int num, den;
public:
  void set(int n, int d) {
    num = n;
    den = d;
    normalize();
  }
  int get_num() {
    return num;
  }
  int get_den() {
    return den;
  }
private:
   void normalize();
   int gcf(int a, int b);
   int lcm(int a, int b);
};

#endif //ndef FRACTION_H   

然后Fraction.cpp包含

#include "Fraction.h"
void Fraction::normalize() {
  if (den == 0 || num == 0) {
    num = 0;
    den = 1;
  }
  if (den < 0) {
    num *= -1;
    den *= -1;
  }
  int n = gcf(num, den);
  num = num / n;
  den = den / n;
}

int Fraction::gcf(int a, int b) {
  if (b == 0)
    return abs(a);
  else
    return gcf(b, a%b);
}

int Fraction::lcm(int a, int b) {
  int n = gcf(a, b);
  return a / n * b;
}

然后在main.cpp中确保您添加

#include "Fraction.h"

包括在内

我将较大的函数从类声明移至Fraction.cpp的主要原因是保持接口整洁。但是,还有其他一些原因需要考虑在标头与翻译单元中实现哪些成员函数。

以下问题对此进行了详细讨论:Why have header files and .cpp files?

在评论中,关于#ifndef FRACTION_H的目的存在疑问,这些人包括护卫队。这里有关于它们的用途的很好的讨论:Why are #ifndef and #define used in C++ header files?