另一种不完整的类型错误C ++

时间:2012-10-23 10:21:47

标签: c++ incomplete-type

  

可能重复:
  Circular Dependencies / Incomplete Types

编写一个简单的c ++程序并感到困惑....

有4个班级,2个对这个错误很重要......

第13行收到错误消息“字段'点'具有不完整类型”和“预期”;' befor'('token'在同一行

错误似乎从Vector3.cpp开始,其中只包含Vector3.h和空方法

在Normal3标题中删除了包含“Vector3.h”,认为它将在一个圆圈中运行......不太好......

一些想法?希望如此:)和ty的答案

以下是我的两个重要课程:

#ifndef NORMAL3_H
#define NORMAL3_H


class Normal3 {


      public:

      double x, y, z;
      Normal3 mul(Normal3 n);
      Normal3 add(Normal3 n);
      Normal3 dot(Vector3 v); //Line 13

      Normal3(double x = 0, double y = 0, double z = 0)
                     : x(x), y(y), z(z)
      { }   

};

#endif //NORMAL3_H

AAAAAAAAAAAAAAAAAAAAAND

#ifndef VECTOR3_H
#define VECTOR3_H

#include "Normal3.h"

class Vector3 {

      public:

      double x, y, z, magnitude;

      Vector3 add(Vector3 v);
      Vector3 add(Normal3 n);
      Vector3 sub(Normal3 n);
      Vector3 mul(double c);
      double dot(Vector3 c);
      double dot(Normal3 n);
      Vector3 normalized();
      Normal3 asNormal();
      Vector3 refelctedOn(Normal3 n);

      Vector3(double x = 0, double y = 0, double z = 0, double m = 0)
                     : x(x), y(y), z(z), magnitude(m)
      { }

};

#endif //VECTOR3_H

2 个答案:

答案 0 :(得分:3)

这只是意味着编译器不知道那时Vector3是什么。如果您事先声明,错误将消失:

#ifndef NORMAL3_H
#define NORMAL3_H

class Vector3;  // Add this line

class Normal3 {
  // ...
};

更新:正如john在他的评论中所说的那样,用另一个前向声明#include "Normal3.h"替换Vector3.h中的class Normal3;将是一个很好的改进:

#ifndef VECTOR3_H
#define VECTOR3_H

class Normal3; // instead of #include "Normal3.h"

class Vector3 {
  // ...
};

您应该尽量将标头中的#include指令保持在最低限度,以避免过多的编译依赖性。如果它定义了您正在使用的类型,则只需要包含标题(通常因为您定义的类具有此类型的数据成员)。如果您只使用指针或对该类型的类型或函数参数的引用(如您的示例所示),则前向声明就足够了。

答案 1 :(得分:0)

您的文件normal3.hVector3一无所知。

我发现Vector3 v没有变成dot,那么你应该写:

代替Normal3 dot(Vector3 v); //Line 13

作为

#ifndef NORMAL3_H
#define NORMAL3_H

class Vector3;

class Normal3 {


      public:

      double x, y, z;
      Normal3 mul(Normal3 n);
      Normal3 add(Normal3 n);
      Normal3 dot(const Vector3 &v); //Line 13

      Normal3(double x = 0, double y = 0, double z = 0)
                     : x(x), y(y), z(z)
      { }   

};

#endif //NORMAL3_H