我刚刚了解到,只要在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
答案 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?