2010-10-22 46 views
6

quaternion.h: 15: lỗi: trường ‘v’ chưa hoàn thành loạiLỗi: Trường có loại không đầy đủ

Xin chào! Tôi bị mắc kẹt trên một lỗi mà tôi dường như không thể giải quyết được.

Dưới đây là mã của tôi:

#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 trông như thế này:

#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 

Thanks for the help nữa =)

+0

phụ thuộc circluar? –

Trả lời

10

Vâng, bạn có bao gồm hình tròn của hai tệp tiêu đề: vec3.hquaternion.h. Bao gồm bảo vệ sẽ đảm bảo rằng mỗi tiêu đề chỉ được bao gồm một lần. Một trong số họ sẽ được bao gồm đầu tiên, thứ hai - thứ hai. Trong trường hợp của bạn quaternion.h được bao gồm đầu tiên, có nghĩa là Vec3 trở thành một loại không đầy đủ trong đó. Đây là những gì trình biên dịch nói với bạn.

Vì bạn đang cố gắng sử dụng đối tượng Vec3 làm thành viên trực tiếp của đối tượng Quaternion, bạn hoàn toàn cần Vec3 là loại hoàn chỉnh. Tiêu đề quaternion.h phải bao gồm tiêu đề vec3.h. Số tờ khai

class Vec3; 

hoàn thành không có gì trong quaternion.h, vì vậy bạn có thể xóa nó.

Được nêu ở trên, nó theo sau vec3.hkhông thể bao gồm quaternion.h, hoặc bạn sẽ kết thúc với bao gồm vòng tròn, không bao giờ đạt được bất kỳ thứ gì. Xóa sự bao gồm của quaternion.h từ vec3.h.Giữ số

class Quaternion; 

khai báo trong vec3.h và xem nó có hoạt động theo cách đó hay không.

0

vấn đề là tập tin của bạn được bao gồm 'ing eachother nơi không có phụ thuộc vòng tròn. vec3 không nên bao gồm quaternion thì mọi thứ sẽ ổn thôi.

nay là lỗi trình biên dịch cho là bởi vì bạn predeclared vec3 nhưng định nghĩa đầy đủ không được đọc nếu vec3 được bao gồm:

vecr3.h -> bao gồm quaternion
quaternion.h -> bao gồm vec3, nhưng bao gồm-bảo vệ nên không có gì xảy ra
quaternion.h -> predeclare vec3,
quaternion.h -> cố gắng sử dụng vec3 // thất bại
vec3.h -> thực sự tuyên bố vec3

chỉ đúng thứ tự là vec3 đầu tiên bao gồm và chỉ THEN th e quaternion bao gồm.

3

Sự cố là sự bao gồm lẫn nhau của .h. Trình biên dịch biết các kiểu, nhưng tại một số thời điểm chúng không đầy đủ. Lời khuyên của tôi là chỉ cần chuyển tiếp tuyên bố Quarternion trong tệp vec3.h, nhưng KHÔNG bao gồm quaternion.h.

Sau đó, quaternion.h có thể bao gồm vec3.h và mọi thứ sẽ biên dịch. Ngoài ra, như JaredPar đã đề xuất, hãy xóa tờ khai chuyển tiếp của Vec3 trong quaternion.h.

Các vấn đề liên quan