C++ 我有一个现有的C++;我想在Visual C+;中添加新头文件的项目+;。我犯了无数错误

C++ 我有一个现有的C++;我想在Visual C+;中添加新头文件的项目+;。我犯了无数错误,c++,visual-c++,header-files,C++,Visual C++,Header Files,我有一个现有的完全功能性的项目,我正在尝试将功能添加到课程项目中。我甚至无法通过第一步(这不是一个好迹象) 我添加了一个新的.h文件,它充满了错误 .h项目中已存在的文件: divide.h subexpression.h etc. etc. divide.h的全部功能内容: class Divide: public SubExpression { public: Divide(Expression* left, Expression* right): SubExpre

我有一个现有的完全功能性的项目,我正在尝试将功能添加到课程项目中。我甚至无法通过第一步(这不是一个好迹象)

我添加了一个新的.h文件,它充满了错误

.h
项目中已存在的文件:

divide.h
subexpression.h
etc. etc.
divide.h
的全部功能内容:

class Divide: public SubExpression
{
public:
    Divide(Expression* left, Expression* right):
        SubExpression(left, right)
    {
    }
    double evaluate()
    {
    return left->evaluate() / right->evaluate();
    }
};
在右键单击项目名称>添加>新建项>“头文件”并将其命名为更大的.h之后,我在更大的.h文件中键入了以下代码:

class Greater: public SubExpression
{
public:
Greater(Expression* left, Expression* right):
    SubExpression(left, right)
    {
    }
    double evaluate()
    {
   return left->evaluate() > right->evaluate();
    }
};
此文件给了我两个错误(如果我尝试键入任何其他内容,它只会添加到错误列表中。无论出于何种原因,它显然没有以任何方式链接到项目。错误如下:

(在子表达式类上):不是类或结构名称

在单词“class”上:PCH警告:找不到合适的标头停止位置。未生成intellisense PCH文件。

这不可能很复杂,但我已经搜索了几个小时,我不知道为什么这个基本过程失败了

为什么Better.h不能以与其他文件相同的方式引用其他项目文件

这些文件位于同一目录中,彼此紧挨着

编辑 我添加了一个屏幕截图,这样你就可以看到我个人所指的内容。
#include
仅仅是一种文本替换。它将文件的内容放在
#include
语句的位置。因此,当包含来自cpp文件的不同相互依赖的标题时,它可能会导致看似奇怪的效果

C++编译器总是从翻译单元(如cpp文件)开始编译。头只在运行时包含。因此,头不必知道
子表达式
,但cpp文件首先包含
更大的内容。h
必须在到达
更大的
之前知道
子表达式

示例(test.cpp): 如您所见,包含的顺序可能会导致外观相同的标题表现不同

为了避免此类问题,使标题自给自足是很重要的。它们应该包括编译它们所需的所有内容。对于父类,您肯定需要子表达式的定义,因此在标题中添加一个
#include“SubExpression.h”是无害的
位于从
子表达式派生的所有类的顶部

如果这样做,上述示例将导致新问题,因为“subexpression.h”将被包含三次,并将导致重新定义错误。因此,还应使用
#ifdef
#pragma一次性将include-guard放置在头文件顶部


可能会导致PCH错误,因为预编译头必须作为使用预编译输出的任何cpp文件中的第一个头包含。例如,如果您的预编译头被称为“common.h”,则使用它的每个cpp文件都必须将
#include“common.h”
作为cpp文件中的第一条语句(忽略注释)。

\include“SubExpression.h”
divide.h
文件不需要/使用include,为什么
greater.h
”?这也不能解决问题。只需添加错误“需要文件名”“这就是
greater.h
中的全部内容吗?您是否有
#include
用于声明
子表达式
的位置?您没有向我们显示足够的文件(或者如果这是文件的全部,那就是问题所在)。@crashmstr在那里,greater.h文件可以与
divide.h
相同(在同一目录中)除除法被替换为更大之外,我得到了与后续错误相同的原始错误。还要注意的是,这不是C#(或使用包、程序集等的任何其他语言)。除非将头文件包含在翻译单元的编译路径中(通常为*.c或*.cpp文件),否则将头文件添加到项目中不会有任何区别。
#include "greater.h" // Fails - what is SubExpression?
#include "subexpression.h"
#include "divide.h" // Works, by now the compiler knows about SubExpression