2010-10-22 18 views
6

quaternion.h है: 15: त्रुटि: क्षेत्र 'वी' अधूरा प्रकारत्रुटि: फील्ड एक अधूरी प्रकार

हाय है! मैं एक त्रुटि पर फंस गया हूं जिसे मैं हल नहीं कर सकता।

#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 इसमें अपूर्ण प्रकार बन गया है। यह संकलक आपको बता रहा है।

जब से तुम Quaternion वस्तु का एक तत्काल सदस्य के रूप में Vec3 वस्तु का उपयोग करने की कोशिश कर रहे हैं, तो आप पूरी तरह से Vec3 जरूरत है एक पूरा प्रकार किया जाना है। quaternion.h शीर्षलेख में vec3.h शीर्षलेख शामिल होना चाहिए।

class Vec3; 

घोषणा quaternion.h में बिल्कुल कुछ भी नहीं प्राप्त होता है, तो आप बस इसे हटा सकते हैं।

ऊपर देखते हुए यह इस प्रकार है कि vec3.hनहीं कर सकते हैं शामिल हैं quaternion.h, या आप परिपत्र शामिल किए जाने, जो कुछ भी प्राप्त होता है कभी नहीं के साथ खत्म हो जाएगा। vec3.h से quaternion.h को शामिल करने से निकालें।vec3.h में

class Quaternion; 

घोषणा रखें और देखें कि क्या वह उस तरह से काम करता है।

0

समस्या यह है कि आपकी फ़ाइलों को शामिल कर रहे हैं 'एक दूसरे को जहां कोई गोलाकार निर्भरता नहीं है। vec3 quaternion शामिल नहीं होना चाहिए तो सब कुछ ठीक हो जाएगा।

अब त्रुटि संकलक दिया है, क्योंकि आप vec3 predeclared लेकिन पूरी परिभाषा पढ़ा नहीं है, तो vec3 शामिल है:

vecr3.h -> शामिल चार का समुदाय
quaternion.h -> vec3 में शामिल हैं, लेकिन शामिल-गार्ड तो कुछ नहीं होता
quaternion.h -> predeclare Vec3,
quaternion.h -> vec3 उपयोग करने के लिए // असफल
कोशिश vec3.h -> वास्तव में vec3

केवल घोषित सही क्रम पहले vec3 शामिल है और केवल तब वें ई quaternion शामिल हैं।

3

समस्या .h पर पारस्परिक समावेश है। कंपाइलर प्रकार जानता है, लेकिन किसी बिंदु पर वे अपूर्ण हैं। मेरी सलाह vec3.h फ़ाइल में Quarternion घोषित करने के लिए आगे बढ़ाना होगा, लेकिन quaternion.h शामिल नहीं है।

फिर, quaternion.h में vec3.h शामिल हो सकते हैं और सब कुछ संकलित हो जाएगा। इसके अलावा, जैसा कि जेरेडपार ने सुझाव दिया है, की quaternion.h में आगे की घोषणा को हटा दें।

संबंधित मुद्दे