【问题标题】:class from a different file, variable declaration doesn't work "incomplete type is not allowed"来自不同文件的类,变量声明不起作用“不允许不完整的类型”
【发布时间】:2024-01-16 21:17:01
【问题描述】:

我有一个这样的文件:

#include <list>
#include "term.h"

class Term {

};

class Number : public Term {
private:
    double m_number;

    Term* m_exponent = nullptr;

public:
    Number(double number) {
        m_number = number;
    }

    Number(double number, Term* exponent) {
        m_number = number;
        m_exponent = exponent;
    }

    double getNumber() {
        return m_number;
    }

    void setExponent(Term* exponent) {
        m_exponent = exponent;
    }

    Term* getExponent() {
        return m_exponent;
    }
};

还有一个像这样的头文件 term.h:

#pragma once

class Term;

class Number;

现在在我的 main 函数中,如果我尝试声明一个 Number 类型的变量 (Number a(10.0)),我会收到以下错误:Incomplete Type is not allowed.

#include "term.h"

int main() {
   Number a(10.0);
}

我不明白这是从哪里来的。任何帮助,将不胜感激。提前致谢! :)

【问题讨论】:

  • 第 6 行缺少的分号是错字吗?
  • 是的,打错了
  • 您想将类定义放在头文件中,将类方法定义放在 .cpp 文件中。
  • 对不起,我是 C++ 新手,所以这个问题可能听起来很愚蠢,但类定义是否意味着所有变量和函数原型?
  • 为了避免提出可能的“愚蠢的问题”并节省时间阅读The Definitive C++ Book Guide and List的一本书。

标签: c++ file types header


【解决方案1】:

好的,快速教程。

C++ 将类的定义和实现的概念分开。这使得它与 Java 等语言不同。现在,如果需要,您可以在定义中内联类的部分内容,但您不必这样做。

您的 .h 文件应包含以下内容:

类Foo { ...完整的定义 };

然后在你的 .cpp 中,实现你在 .h 中没有做的任何事情:

void Foo::someMethod() { ... }

您的 main.cpp 完全不知道 Number 类是什么。它知道这是一个类,但仅此而已。它需要知道。

基本上,您的第一个 sn-p 中的所有内容都需要出现在 .h 文件中,以便其他 .cpp 文件可以看到它是什么。

【讨论】: