c++ - 将主文件拆分为头文件、源文件和主文件后出现多个错误
问题描述
我让这个程序在一个主文件中完美运行。
但我需要将它分成头文件和源文件。
我现在遇到了很多错误,我对我在这里缺少的东西感到茫然。
用同学的头文件和源文件测试了main,它工作正常。所以问题出在头文件或源文件中。
#ifndef JMTDRational
#define JMTDRational
#include <string>
#include <sstream>
class JMTDRational{
private:
int numerator;
int denominator;
public:
void set_numerator(int num);
void set_denominator(int den);
int get_numerator() const;
int get_denominator() const;
std::string r_to_string();
double r_to_decimal();
JMTDRational add(const JMTDRational & obj);
JMTDRational subtract(const JMTDRational & obj);
JMTDRational multiply(const JMTDRational & obj);
JMTDRational divide(const JMTDRational & obj);
JMTDRational();
JMTDRational(int num,int den);
JMTDRational reduce(const JMTDRational);
int gcd(int n, int d);
};
#endif // JMTDRational
#include "JMTDRational.h"
void JMTDRational::set_numerator(int num)
{
numerator = num;
}
void JMTDRational::set_denominator(int den)
{
if (den != 0) {
denominator = den;
}
else{
denominator = 1;
}
}
int JMTDRational::get_numerator() const
{
return numerator;
}
int JMTDRational::get_denominator() const
{
return denominator;
}
string JMTDRational::r_to_string()
{
ostringstream str1, str2;
str1 << get_numerator();
str2 << get_denominator();
string temp = str1.str() + "/" + str2.str();
return temp;
}
double JMTDRational::r_to_decimal()
{
double temp = get_numerator() / get_denominator();
return temp;
}
JMTDRational::JMTDRational(int num,int den) {
numerator = num;
denominator = den;
}
JMTDRational::JMTDRational() {
numerator = 0;
denominator = 1;
}
JMTDRational JMTDRational::reduce(const JMTDRational)
{
int temp_numerator = get_numerator() / gcd(get_numerator(),get_denominator());
int temp_denominator = get_denominator() / gcd(get_numerator(),get_denominator());
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
int JMTDRational::gcd(int n, int d)
{
if (d == 0)
return n;
return gcd(d, n % d);
}
JMTDRational JMTDRational::add(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator() + obj.get_numerator() * get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::subtract(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator() - obj.get_numerator() * get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::multiply(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_numerator();
int temp_denominator = get_denominator() * obj.get_denominator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
JMTDRational JMTDRational::divide(const JMTDRational & obj)
{
int temp_numerator = get_numerator() * obj.get_denominator();
int temp_denominator = get_denominator() * obj.get_numerator();
JMTDRational temp(temp_numerator,temp_denominator);
return temp;
}
解决方案
在头文件中你有defined
name:JMTDRational
为一个空值。
#ifndef JMTDRational
#define JMTDRational
#include <string>
#include <sstream>
class JMTDRational{
所以在你的代码中你有名字JMTDRational
的任何地方,预处理器都会用“nothing”替换它。
例如:
JMTDRational add(const JMTDRational & obj);
JMTDRational subtract(const JMTDRational & obj);
变成:
add(const& obj);
subtract(const & obj);
这是无效的代码。
您需要在 Header 保护中使用唯一的强化名称:
#define JMTDRATIONAL_H_HEADER
推荐阅读
- php - PHP 的 JSON 解码问题(Pixabay API)
- apache-kafka - 如果 Kafka 生产者设置是在代理中定义的,而不是生产者,它会采用吗?
- python - 动态命名模型对象
- flutter - Flutter HiveDB 在 FutureBuilder 上使用框
- ios - 无法使用类型为“(字符串)”的参数列表调用“附加”
- windows - “启用基于实验性 WSL 2 的引擎”不可选择
- javascript - javascript 在我单击并按住鼠标时追加
- sql - 返回查询中比较的结果
- office-js - Office.context.mailbox.item.organizer.emailAddress 和 Office.context.mailbox.userProfile.emailAddress 之间有区别吗
- flutter - Flutter dart:ffi 使用静态 c 库 .a 存档