2010-10-22 19 views
6

quaternion.h: 15: błąd: pole "v" ma niepełny typBłąd: Pole ma niekompletny typ

Witam! Utknąłem na błędzie, którego nie mogę rozwiązać.

Poniżej jest mój kod:

#ifndef QUATERNION_H 
#define QUATERNION_H 

#include "vec3.h" 

class Vec3; 

class Quaternion 
{ 

public: 

Quaternion(Vec3 v); 

Quaternion(double w, Vec3 v); 

Vec3 v; <--------------------------This is where the error is :(

double scalar; 



Quaternion operator *(Quaternion s); 

Quaternion conjugate(); 

}; 



#endif 

My Vec.h wygląda następująco:

#ifndef VEC3_H 

#define VEC3_H 



#include "point.h" 

#include "quaternion.h" 

#include <math.h> 

class Quaternion; 


class Vec3 

{ 

friend ofstream& operator <<(ofstream& output, const Vec3& p); 

friend ifstream& operator >>(ifstream& input, Vec3& p); 



public: 

Vec3(); 

Vec3(double _x, double _y); 

Vec3(double _x, double _y, double _z); 



double x,y,z; 



//Operators 

Vec3 operator -(Vec3 a) const; 

Vec3 operator /(double s) const; 

Vec3 operator *(double s) const; 

Vec3 operator *(Quaternion q) const; 



// Used to do vector Vec3 addition 

Vec3 operator +(Vec3 a) const; 

Point operator +(Point a) const; 



Vec3& operator =(Point a); 



Vec3 crossProduct(Vec3 v1); // Itself cross v1 

double dotProduct(Vec3 v); 

double length(); 

void normalize(); 


}; 



#endif 

Dzięki za pomoc jeszcze raz =)

+0

zależność circluar? –

Odpowiedz

10

Cóż, masz okrągłe uwzględnienie dwóch plików nagłówkowych: vec3.h i quaternion.h. Uwzględnij strażników upewnij się, że każdy nagłówek jest zawarty tylko raz. Jeden z nich zostanie włączony jako pierwszy, drugi - drugi. W twoim przypadku quaternion.h jest zawarty jako pierwszy, co oznacza, że ​​Vec3 staje się niekompletnym typem. To właśnie mówi ci kompilator.

Ponieważ próbujesz użyć obiektu Vec3 jako bezpośredniego członka obiektu Quaternion, absolutnie potrzebujesz Vec3, aby być kompletnym typem. Nagłówek quaternion.h musi zawierać nagłówek vec3.h. Deklaracjanie osiąga absolutnie niczego w quaternion.h, więc możesz ją po prostu usunąć.

Biorąc powyższe pod uwagę, wynika, że ​​vec3.hnie może obejmują quaternion.h, lub będziesz skończyć z włączeniem kołowej, która nigdy nie osiąga niczego. Usuń włączenie quaternion.h z vec3.h.Przechowywanie deklaracji

class Quaternion; 

w vec3.h i sprawdzić, czy to działa w ten sposób.

0

problemem jest to, że pliki są m.in. "siebie nawzajem, gdy nie ma zależności od koła. vec3 nie powinien zawierać kwaternionu, wtedy wszystko będzie w porządku.

teraz błąd kompilator dał się tak, ponieważ predeklarowany vec3 ale pełna definicja nie jest czytana jeżeli vec3 wliczone jest:

vecr3.h -> to quaternion
quaternion.h -> to vec3, ale zawierają-strażników tak nic się nie dzieje
quaternion.h -> predeclare vec3,
quaternion.h -> spróbować użyć vec3 // nie
vec3.h -> faktycznie zadeklarować vec3

jedynym prawidłowa kolejność jest pierwsza vec3 zawiera i tylko THEN th obejmuje także kwaternion.

3

Problem polega na wzajemnym włączeniu urządzenia .h. Kompilator zna typy, ale w pewnym momencie są one niepełne. Moją radą byłoby po prostu przesłać oświadczenie Quarternion w pliku vec3.h, ale NIE obejmuje to quaternion.h.

Następnie quaternion.h może zawierać vec3.h i wszystko się skompiluje. Ponadto, jak zasugerował JaredPar, usuń deklarację forward z Vec3 w quaternion.h.

Powiązane problemy