2010-10-22 4 views
6

quaternion.h: 15: ошибка: Поле 'v' имеет неполный типОшибка: Поле имеет незавершенное строительство

Hi! Я застрял на ошибке, которую я не могу решить.

Ниже мой код:

#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 

Мои Vec.h выглядит следующим образом:

#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 

Спасибо за помощь еще раз =)

+0

загрязняющая жидкость зависимость? –

ответ

10

Ну, у вас есть круговое включение двух файлов заголовков: vec3.h и quaternion.h. Включите охранники, убедитесь, что каждый заголовок включен только один раз. Один из них будет включен первым, второй - второй. В вашем случае quaternion.h включен первым, что означает, что Vec3 становится неполным. Об этом говорит компилятор.

Поскольку вы пытаетесь использовать объект Vec3 как неотъемлемый член объекта Quaternion, вам абсолютно необходим Vec3, чтобы быть полным. Заголовок quaternion.h должен содержать заголовок vec3.h.

class Vec3; 

декларация не достигает абсолютно ничего quaternion.h, так что вы можете просто удалить его.

Учитывая вышесказанное, следует, что vec3.hможет не включать в себяquaternion.h, или вы в конечном итоге с круговым включением, который никогда не достигает ничего. Удалите включение quaternion.h от vec3.h.Держите декларацию

class Quaternion; 

в vec3.h и посмотреть, если он работает таким образом.

0

проблема заключается в том, что ваши файлы включают в себя 'eachother, где нет круговой зависимости. vec3 не должен включать кватернион, тогда все будет в порядке.

теперь ошибка компилятор дал потому, что вы предопределенные Vec3 но полное определение не читать, если vec3 входит:

vecr3.h -> включают кватернионов
quaternion.h -> включают Vec3, но включают в себя охранников, так ничего не происходит
quaternion.h -> predeclare vec3,
quaternion.h -> пытаются использовать vec3 // сбой
vec3.h -> фактически объявить vec3

только правильный порядок - первый vec3, и только THEN th e quaternion.

3

Проблема заключается в взаимном включении .h. Компилятор знает типы, но в какой-то момент они неполны. Моим советом было бы просто направить объявление Quarternion в файл vec3.h, но НЕ включать quaternion.h.

Затем quaternion.h может включать vec3.h и все будет скомпилировано. Также, как предложил JaredPar, удалите переднюю декларацию Vec3 в quaternion.h.

Смежные вопросы