我是c ++的初学者,我的头文件管理存在问题。我有一个类Matrix,它有.h和.cpp文件。我有第二个类Map,它也有自己的.h和.cpp文件。 Map.h包含Matrix.h,到目前为止它的工作原理。但是当我去编写Map(在Map.cpp中)的实现并使用Matrix.h中定义的东西时,它给了我一个未定义的引用错误。包括Matrix.cpp确实可以解决问题,但我知道这是一个不好的做法。那么,我应该做什么以及为什么?
非常感谢!
编辑:我做了一个测试。我在Matrix.h中输入了一个函数declration,在Matrix.cpp中实现了它,然后在Map.cpp中使用它。它确实工作,没有包括Matrix.cpp。只有属于Matrix类的东西才会让事情变得疯狂。答案 0 :(得分:0)
可能你的问题是你忘了编译Matrix.cpp。这似乎是一个令人惊讶的(对我来说)常见的错误。你是如何调用编译器的?
答案 1 :(得分:0)
首先,我会问明显的;在#include
中有Map.h
编辑Map.cpp
吗?
我还要指出,Map.h
可能根本不需要包含Matrix.h
。如果您对Matrix
中Map.h
的唯一引用是指针/引用参数,那么您可以简单地转发声明该类:
// forward declare some currently unknown type "Matrix"
class Matrix;
class Map
{
public:
void SomeOperation( const Matrix& matrix );
};
只要参数是指针或引用类型,编译器就不需要知道Matrix
的大小,因此一切正常。如果可以的话,这比在.h文件中包含更多标题更好。然后,您会在Matrix.h
文件中包含Map.h
和Map.cpp
。
答案 2 :(得分:0)
您可能希望在编译中包含两个.h文件,以便需要定义,而不是相互之间。
然后你应该链接到Matrix.o,基于你在Matrix.cpp中定义编译Map.cpp所需的符号的假设。这是发生了什么事吗?
答案 3 :(得分:0)
简单规则: -
... ...头文件的东西 ...
在头文件中包含所有类定义/其他声明。有关.cpp文件中的定义。
始终尽量避免从另一个头文件中包含一个头文件。 大多数时候都会做一个外部宣言。 已链接将自动解析参考。
可以包含.cpp文件中的头文件。但是在这里,大多数时候事情只有外部声明。