2010-10-22 28 views
0

我已經擺脫了循環依賴,但仍然有其他問題的問題。#包括#includes和不完整類型的問題

我仍在學習,並希望有人能夠向我解釋更多關於我的實現有什麼問題。對不起,我很感激每個幫助我的人。

因此,我現在遇到的問題是,在我的Vec3類中,它試圖使用Quaternion,但它沒有「完整類型」的四元數。

以下是我有:

vec3.h

#ifndef VEC3_H 

#define VEC3_H 



#include "point.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 

Quaternion.h

#ifndef QUATERNION_H  
#define QUATERNION_H 

#include "vec3.h" 


class Quaternion 

{ 



public: 

    Quaternion(Vec3 v); 

    Quaternion(double w, Vec3 v); 



    Vec3 v; 

    double scalar; 



    Quaternion operator *(Quaternion s); 

    Quaternion conjugate(); 

}; 



#endif 

vec3.cpp 的錯誤是每個此功能的一行。

...  

Vec3 Vec3::operator *(Quaternion q) const 

{ 

    // Change this vector into a quaternion 

    Quaternion currentQuat(0, Vec3(x,y,z)); 

    Quaternion newQuat = currentQuat*q; 

    Quaternion result = q.conjugate()*newQuat; 



    return result.vec(); 

} 

... 

回答

2

您需要

#include "Quaternion.h" 

增加的vec3.cpp頂部。

+0

謝謝,哇,我忘了我刪除.h文件quaternion.h。非常感謝=) – Aero 2010-10-22 18:15:33

1

在cpp文件中,您應該包含Quaternion的標題。

頭文件中的前向聲明只是幫助您獲取所有聲明,因此聲明不需要彼此完全可用。

要使用類型,您需要實際包含標題。

1

如果你只有在頭文件中預先聲明,你只能使用參數列表作爲一個指針或引用類型,所以更改

Vec3 operator *(Quaternion q) const;

Vec3 operator *(const Quaternion &q) const;

1

對類型的前向聲明足以使用指向該類型的指針。

class Quaternion; 

void func(Quaternion* q); 

但是,只要您直接使用該類型,前向聲明已經不夠用了。

void func(Quaternion q); 

對於編譯器使用的類型,而不是一個指針類型,它需要完整的類型聲明,而不僅僅是一個向前聲明。在這種情況下,你有一個四元數的前向聲明,但不是完整的聲明,所以編譯器給出了類型四元數不完整的錯誤。解決方案是通過包含Quaternion.h爲vec3.h提供Quaternion的完整類型聲明。

順便說一句,你的一個頭文件是大寫的,而另一個不是。您可能想要選擇更一致的命名方案。