【问题标题】:Class object is 'undefined' in int main()类对象在 int main() 中为“未定义”
【发布时间】:2019-09-15 03:35:26
【问题描述】:

我有两个 .cpp 文件“rational.cpp”和“main.cpp”以及一个“rational.h”文件。在“rational.cpp”中,我声明了一个 Rational 类,并在两个文件的顶部包含了“rational.h”;但是,当我尝试创建对象 Rational rat; 时。我收到错误“标识符“Rational”未定义”。我很迷茫。

这里是“main.cpp”

#include "rational.h"


int main() {
    int select = 1, n, d;

    while (select != 0) {
        cout << "Enter numerator";
        cin >> n;
        cout << "\nEnter denominator";
        cin >> d;
        try {
            if (d == 0) { 
                throw 0;
            }
        }
        catch (int e) {
            cout << "/nerror: cannot divide by 0" << endl;
            cout << "enter a new denominator: ";
            cin >> d;
        }

        Rational rat;

        cout << "1. Add a rational\n2. Subtract a rational\n3. Multiply by a rational\n4. Divide by a rational\n0. Exit";
        cout << "enter selector" << endl;
        cin >> select;
        switch (select) {
        case 1: rat.add(n, d); break;
        case 2: rat.sub(n, d); break;
        case 3: rat.mul(n, d); break;
        case 4: rat.div(n, d); break;
        case 0: break;
        default:
            try {
                throw select;
            }
            catch (int e) {
                cout << e << " is not a valid option" << endl;
            }
            catch (...) {
                cout << "error: invalid option" << endl;
            }
            break;
        }

    }
    return 0;

}

"rational.cpp"

#include "rational.h"


class Rational{
public:

    void reduce(int n, int d);
    //define math functions
    void add(int n, int d);
    void sub(int n, int d);
    void div(int n, int d);
    void mul(int n, int d);
};

void Rational::reduce(int n, int d) {


}

void Rational::add(int n, int d) {


}

void Rational::sub(int n, int d) {


}

void Rational::div(int n, int d) {


}

void Rational::mul(int n, int d) {


}

"rational.h"

#pragma once
#ifndef RATIONAL
#define RATIONAL

#include <iostream>
#include <math.h>
#include <exception>

using namespace std;

#endif

还有我的 Makefile

rational.exe:   main.o  rational.o  
    g++ -o  rational.exe    main.o  rational.o

main.o: main.cpp    rational.h
    g++ -c  main.cpp 

rational.o: rational.cpp    rational.h
    g++ -c  rational.cpp

我是用cygwin编译的。

【问题讨论】:

标签: c++ class object makefile compiler-errors


【解决方案1】:

rational 的声明必须在标头内,否则编译器不会在 main.cpp 中读取它(因为缺少更好的词)。

您需要将声明(即以下部分)移动到rational.h:

class Rational{
public:

    void reduce(int n, int d);
    //define math functions
    void add(int n, int d);
    void sub(int n, int d);
    void div(int n, int d);
    void mul(int n, int d);
};

有关详细信息,请参阅this question

【讨论】:

    【解决方案2】:

    尽管您在 main.cpp 文件中包含了 Rational.h,但 Rational.h 不包含任何 Rational 类的定义/声明。 在 Rational.h 文件中声明/定义 Rational 类,并将所有函数实现保存在 cpp 文件中。 添加

    class Rational;
    

    给你的头文件

    【讨论】:

    • 这不会修复像rat.add(n, d); 这样的代码。为此,编译器必须查看Rational 的完整定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2018-07-14
    • 1970-01-01
    • 2023-03-08
    • 2022-01-06
    相关资源
    最近更新 更多