我已经摆脱了循环依赖,但我仍然遇到另一个问题。
我还在学习,希望有人能够向我解释我的实施有什么问题。对不起,我很感激所有帮助我的人。
所以,我现在遇到的问题是,在我的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();
}
...
答案 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的完整类型声明。
顺便说一下,你的一个头文件大写而另一个不是大写有点奇怪。您可能希望选择更一致的命名方案。