【问题标题】:Having issues with #includes and incomplete types#includes 和不完整类型存在问题
【发布时间】:2010-10-22 18:09:44
【问题描述】:

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

我仍在学习中,希望有人可以向我解释我的实施有什么问题。很抱歉给我带来了麻烦,但我真的很感谢所有帮助我的人。

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

以下是我所拥有的:

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

四元数.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();

}

...

【问题讨论】:

    标签: c++ incomplete-type


    【解决方案1】:

    你需要添加

     #include "Quaternion.h"
    

    vec3.cpp的顶部。

    【讨论】:

    • 谢谢,我忘了我在 .h 文件中删除了 quaternion.h。非常感谢 =)
    【解决方案2】:

    在 cpp 文件中,您应该包含四元数的标头。

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

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

    【讨论】:

      【解决方案3】:

      如果头文件中只有前向声明,则只能将参数列表中的类型用作指针或引用,所以改变你的

      Vec3 operator *(Quaternion q) const;

      Vec3 operator *(const Quaternion &amp;q) const;

      【讨论】:

        【解决方案4】:

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

        class Quaternion;
        
        void func(Quaternion* q);
        

        但是,一旦直接使用类型,前向声明就不够了。

        void func(Quaternion q);
        

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

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

        【讨论】:

          猜你喜欢
          • 2017-09-23
          • 1970-01-01
          • 2010-12-18
          • 2016-05-05
          • 2021-11-13
          • 2011-07-13
          • 1970-01-01
          • 2011-01-04
          • 1970-01-01
          相关资源
          最近更新 更多