遇到#includes和不完整类型的问题

时间:2010-10-22 18:09:44

标签: c++ incomplete-type

我已经摆脱了循环依赖,但我仍然遇到另一个问题。

我还在学习,希望有人能够向我解释我的实施有什么问题。对不起,我很感激所有帮助我的人。

所以,我现在遇到的问题是,在我的Vec3类中,它试图使用Quaternions,但它没有四元数的“完整类型”。

以下是我所拥有的:

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();

}

...

4 个答案:

答案 0 :(得分:2)

您需要添加

 #include "Quaternion.h"

vec3.cpp的顶部。

答案 1 :(得分:1)

在cpp文件中,您应该包含Quaternion的标题。

标题中的前向声明只是帮助您正确获取所有声明,因此声明不需要彼此完全可用。

要使用类型,您需要实际包含标题。

答案 2 :(得分:1)

如果头文件中只有前向声明,则只能使用参数列表中的类型作为指针或引用,因此请更改

Vec3 operator *(Quaternion q) const;

Vec3 operator *(const Quaternion &q) const;

答案 3 :(得分:1)

对类型的前向声明足以使用指向该类型的指针。

class Quaternion;

void func(Quaternion* q);

但是,只要您直接使用该类型,前向声明就不够了。

void func(Quaternion q);

对于编译器使用类型而不是指向类型的指针,它需要完整类型声明而不仅仅是前向声明。在这种情况下,您有Quaternion的前向声明但没有完整声明,因此编译器会给出Quaternion类型不完整的错误。解决方案是通过包含Quaternion.h为vec3.h提供Quaternion的完整类型声明。

顺便说一下,你的一个头文件大写而另一个不是大写有点奇怪。您可能希望选择更一致的命名方案。