1

重複の可能性:
循環依存/不完全なタイプ

ちょっとしたc++プログラムを書いて、混乱する…。

4つのクラスがあり、2つはこのエラーにとって重要です...

13行目に「フィールド'ドット'のタイプが不完全です」というエラーメッセージと「期待される」が表示されました。同じ行の'('トークン"の前

エラーはVector3.cppで始まっているようです。ここでは、Vector3.hと空のメソッドのみが含まれています。

Normal3ヘッダーのインクルード「Vector3.h」を削除しました。思考は円を描いて実行されます...あまりよくありません...

いくつかのアイデア?そう願っています:)そして答えのためのty

これが私の2つの重要なクラスです。

#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
4

2 に答える 2

3

Vector3これは、コンパイラがその時点で何が起こっているのかを知らないことを意味します。事前に宣言すると、エラーは消えます。

#ifndef NORMAL3_H
#define NORMAL3_H

class Vector3;  // Add this line

class Normal3 {
  // ...
};

更新:ジョン#include "Normal3.h"がコメントで述べているように、Vector3.hを別の前方宣言に置き換えることは良い改善になるでしょうclass Normal3;

#ifndef VECTOR3_H
#define VECTOR3_H

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

class Vector3 {
  // ...
};

#include過度のコンパイル依存関係を回避するために、ヘッダー内のディレクティブを最小限に抑えるようにしてください。ヘッダーを含める必要があるのは、使用しているタイプを定義している場合のみです(通常、定義しているクラスにはこのタイプのデータメンバーがあるため)。(例のように)そのタイプまたはそのタイプの関数パラメーターへのポインターまたは参照のみを使用している場合は、前方宣言で十分です。

于 2012-10-23T10:26:45.677 に答える
0

あなたのファイルnormal3.hは何も知りませんVector3

私はそれがに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
于 2012-10-23T10:43:36.540 に答える