c++ - 将主文件拆分为 header 、源文件和主文件后出现多个错误

标签 c++

我让这个程序在一个主文件中完美运行。

但我需要将它分成头文件和源文件。

我现在遇到了大量错误,我对这里缺少的东西感到茫然。

使用同学头文件和源文件测试了主要内容,它有效。所以问题出在头文件或源文件中。

#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;
        }

最佳答案

在头文件中,您已定义名称: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

关于c++ - 将主文件拆分为 header 、源文件和主文件后出现多个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60160812/

相关文章:

c++ - 在 Windows 上的 ubuntu 上的 bash 上安装 g++

c++ - 最有效的 const char* 比较不区分大小写

c++ - 用于类似资源管理器的系统 View 的 COM 库

c++ - 为什么 cin >> string 不能与 Visual C++ 2010 一起使用?

c++ - 线和 3D 模型相交

c++ - ROS 订阅者回调丢失消息

c++ - 我什么时候应该在智能指针上使用原始指针?

c++ - opengl glrotatef 无法正确旋转

c++ - 这段代码的编译是标准行为吗?

c++ - 比较指向成员的指针?