2010-10-22 7 views
6

quaternion.h: 15: errore: campo 'v' ha tipo incompletoErrore: campo ha un tipo incompleto

Ciao! Sono bloccato su un errore che non riesco a risolvere.

Qui di seguito è il mio codice:

#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 

mio Vec.h assomiglia a questo:

#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 

Grazie per l'aiuto di nuovo =)

+0

dependance circluar? –

risposta

10

Bene, si dispone di inclusione circolare di due file di intestazione: vec3.h e quaternion.h. Includi le guardie per assicurarti che ogni intestazione sia inclusa solo una volta. Uno di loro sarà incluso per primo, l'altro - secondo. Nel tuo caso, quaternion.h è incluso per primo, il che significa che Vec3 diventa un tipo incompleto. Questo è ciò che il compilatore ti sta dicendo.

Poiché si sta tentando di utilizzare l'oggetto Vec3 come membro immediato dell'oggetto Quaternion, è assolutamente necessario che Vec3 sia un tipo completo. L'intestazione quaternion.h deve includere l'intestazione vec3.h. La dichiarazione

class Vec3; 

ottiene assolutamente nulla in quaternion.h, in modo da poter semplicemente rimuoverlo.

luce di quanto sopra, ne consegue che vec3.hnon può includono quaternion.h, oppure si ritroverà con inclusione circolare, che non raggiunge mai nulla. Rimuovere l'inclusione di quaternion.h da vec3.h.Mantenere la dichiarazione

class Quaternion; 

in vec3.h e vedere se funziona in questo modo.

0

il problema è che i file sono di includere 'a vicenda dove non c'è dipendenza circolare. vec3 non dovrebbe includere quaternion quindi tutto andrà bene.

ora l'errore del compilatore ha dato è perché si predichiarati vec3 ma la definizione completa non viene letto se vec3 è incluso:

vecr3.h -> includono quaternione
quaternion.h -> includono vec3, ma include-guardie in modo non succede nulla
quaternion.h -> predichiarare Vec3,
quaternion.h -> cercare di utilizzare vec3 // impossibile
vec3.h -> in realtà dichiarare vec3

l'unico l'ordine corretto è il primo vec3 incluso e solo THEN th e quaternion include.

3

Il problema è l'inclusione reciproca di .h. Il compilatore conosce i tipi, ma a un certo punto sono incompleti. Il mio consiglio sarebbe quello di inoltrare semplicemente dichiarare Quarternion nel file vec3.h, ma NON includere quaternion.h.

Quindi, quaternion.h può includere vec3.h e tutto verrà compilato. Inoltre, come suggerito da JaredPar, rimuovere la dichiarazione anticipata di Vec3 in quaternion.h.