我有一个完整的功能项目,我试图在课程项目中添加功能。我甚至无法超越第一步(不是一个好兆头)。
我添加了一个新的.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();
}
};
右键单击项目名称>添加>新项目> “头文件”,然后将其命名为greater.h我将以下代码输入到greater.h文件中:
class Greater: public SubExpression
{
public:
Greater(Expression* left, Expression* right):
SubExpression(left, right)
{
}
double evaluate()
{
return left->evaluate() > right->evaluate();
}
};
这个文件给了我两个错误(如果我尝试输入任何其他内容,它只会添加到错误列表中。它显然没有出于任何原因以任何方式链接到项目。错误如下:
(在SubExpression类上):不是类或结构名称
单词“class”: PCH警告:找不到合适的标题停止位置。未生成智能感知PCH文件。
这可能不复杂,但我搜索了几个小时,我无法弄清楚为什么这个基本过程失败。
为什么不能以与其他文件相同的方式引用其他项目文件?
这些文件位于彼此相邻的同一目录中。
修改
我正在添加屏幕截图,以便您可以看到我个人所指的内容。
答案 0 :(得分:2)
#include
仅仅是文字替代品。它将文件的内容放在#include
语句的位置。因此,当从cpp文件中包含不同的相互依赖的头时,它可能会导致看似奇怪的效果。
C ++编译器总是从翻译单元(如cpp-file)开始编译。标题只包含在旅途中。因此,标头不必知道SubExpression
,但是第一个包含greater.h
的cpp文件在到达SubExpression
之前必须知道Greater
。
#include "greater.h" // Fails - what is SubExpression?
#include "subexpression.h"
#include "divide.h" // Works, by now the compiler knows about SubExpression
如您所见,包含的顺序可能导致看起来相同的标题行为不同。
为了避免这些问题,重要的是使标题自给自足。它们应该包括编译它们所需的一切。如果是父类,您肯定需要SubExpression的定义,因此将#include "subexpression.h"
放在源自SubExpression
的所有类的顶部没有任何害处。
如果你这样做,上面的例子将引起新的问题,因为“subexpression.h”将被包含三次并将导致重新定义错误。因此,您还应该在头文件顶部使用#ifdef
或#pragma once
放置包含警戒。
可能导致PCH错误,因为必须使用预编译输出将预编译头作为第一个头包含在任何cpp文件中。例如,如果您的预编译头被称为“common.h”,则每个使用它的cpp文件必须具有#include "common.h"
作为cpp文件中的第一个语句(忽略注释)。