C ++导入循环有两个类?

时间:2011-10-06 00:03:26

标签: c++ class import compiler-errors

我确定之前已经问过这个问题,但我似乎无法找到它。

我有两个课程,VectorPoint

文件是这样的(有点重复):

vector.h

#include <math.h>
#include <stdlib.h>

class Vector {
  friend class Point;

  public:
    ...

    Vector(Point); // Line 16

vector.cpp

#include <math.h>
#include <stdlib.h>

#include "vector.h"

...

Vector::Vector(Point point) { // Line 29
  x = point.x;
  y = point.y;
  z = point.z;
}

point.cpppoint.h看起来大致相同,只是您在定义中将vectorpoint交换。

我将它们包括在内:

#include "structures/vector.cpp"
#include "structures/point.cpp"

编译时,我收到此错误:

structures/vector.h:16:17: error: field ‘Point’ has incomplete type
structures/vector.cpp:29:15: error: expected constructor, destructor, or type conversion before ‘(’ token

我认为此错误表明Point尚未声明,但当我通过导入vector.hpoint.cpp内声明它时,我得到巨大的< / em>一堆错误。

有人能解释一下这个问题吗?

谢谢!


在应用@ ildjarn的建议后,这些错误消失了,我只剩下这一个:

structures/vector.h:16:18: error: expected ‘)’ before ‘const’

这一行:

Vector(Point const);

我在.cpp文件中定义它:

Vector::Vector(Point const &point) {

1 个答案:

答案 0 :(得分:5)

  1. 您不应该包含.cpp文件,您应该包含.h文件。

  2. vector.cpp需要#include "point.h"和(推测)point.cpp需要#include "vector.h"

  3. 如果您没有做任何需要类型大小或界面的事情,那么前向声明就足够了。因为Vector的构造函数按值Point取值,所以它的大小必须是已知的;更改Vector的构造函数,以取代Point const引用,前向声明仍然足够。

  4. 您的标题需要#include guards(或#pragma once,如果您不介意不是100%可移植的话。)

  5. 编辑(响应OP的编辑):

    您的声明和定义现在不匹配 - 即您的定义是正确的,但您的声明需要Point const&,而不仅仅是Point const