相互依赖的类定义

Interdependent class definitions

本文关键字:定义 依赖      更新时间:2023-10-16

问题

我有两个类:4元素向量(Vec4)和4x4矩阵(Mat4)。我试图在每个类中为另一个类定义乘法运算符:

class Mat4;
class Vec4;
class Vec4
{
public:
    float x, y, z, w;
    const Vec4 operator *(const Mat4& m)const
    {
        Vec4 r;
        //...
        return r;
    }
};
class Mat4
{
public:
    Mat4()
    { //... }
    union
    {
        Vec4  v[4];
        float m[4][4];
        struct
        {
            float _11, _12, _13, _14,
                  _21, _22, _23, _24,
                  _31, _32, _33, _34,
                  _41, _42, _43, _44;
        };
    };
    const Vec4 operator *(const Vec4& x)const
    {
        Vec4 r;
        //...
        return r;
    }

编译器(MSVC++)在Vec4::operator*处阻塞,抛出错误
C2027:使用未定义类型"Mat4"

正如你所看到的,我已经在它们各自定义为之前声明了这两个类

class Mat4;
class Vec4;

任何关于我如何在不引发这些种族问题的情况下拥有这个运营商的建议都将不胜感激。

问题出现了,因为在同一个文件中有定义和实现。尝试将定义(原型)拆分到头文件中,只使用指向其他类的指针,并将实现放入一个单独的c++文件中,该文件包括头文件和其他类的头。

基本上,它告诉你,它确实知道,有一个Mat4和一个Vec4类。。。但它对它一无所知,除非你告诉它去哪里看。

这里仅仅向前声明是不够的。这告诉编译器是一个类型Mat4,但仅此而已。虽然您可以在签名中使用它(带有指针和引用),但在定义之前不可能使用它。因此,您需要将声明和定义拆分到不同的文件中。