C ++新手头文件问题

时间:2011-08-25 19:25:03

标签: c++ header

我是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类的东西才会让事情变得疯狂。

4 个答案:

答案 0 :(得分:0)

可能你的问题是你忘了编译Matrix.cpp。这似乎是一个令人惊讶的(对我来说)常见的错误。你是如何调用编译器的?

答案 1 :(得分:0)

首先,我会问明显的;在#include中有Map.h编辑Map.cpp吗?

我还要指出,Map.h可能根本不需要包含Matrix.h。如果您对MatrixMap.h的唯一引用是指针/引用参数,那么您可以简单地转发声明该类:

// forward declare some currently unknown type "Matrix"
class Matrix;

class Map
{
public: 
    void SomeOperation( const Matrix& matrix );
};

只要参数是指针或引用类型,编译器就不需要知道Matrix的大小,因此一切正常。如果可以的话,这比在.h文件中包含更多标题更好。然后,您会在Matrix.h文件中包含Map.hMap.cpp

答案 2 :(得分:0)

您可能希望在编译中包含两个.h文件,以便需要定义,而不是相互之间。

然后你应该链接到Matrix.o,基于你在Matrix.cpp中定义编译Map.cpp所需的符号的假设。这是发生了什么事吗?

答案 3 :(得分:0)

简单规则: -

  1. 在头文件中使用警卫,例如: -

    ifndef MATRIX_H

  2. 定义MATRIX_H

    ... ...头文件的东西 ...

    ENDIF

    1. 在头文件中包含所有类定义/其他声明。有关.cpp文件中的定义。

    2. 始终尽量避免从另一个头文件中包含一个头文件。 大多数时候都会做一个外部宣言。 已链接将自动解析参考。

    3. 可以包含.cpp文件中的头文件。但是在这里,大多数时候事情只有外部声明。