【问题标题】:Interdependent class definitions相互依赖的类定义
【发布时间】:2013-09-03 02:21:24
【问题描述】:

问题

我有两个类:一个 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: use of undefined type 'Mat4'

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

class Mat4;
class Vec4;

非常感谢任何关于我如何在不引起这些竞争问题的情况下使用此运算符的建议。

【问题讨论】:

  • 只需将类中的方法签名和另一个文件中的实现签名即可
  • 对于前向声明的类,您无能为力。在两个类的定义可见的类定义之外定义成员函数。
  • 不要让它们成为成员函数,只需将运算符放在它们的共享命名空间中即可。
  • 谢谢 jthill,这正是我正在寻找的答案。我并不是特别想在单独的文件中声明它们。

标签: c++ class oop


【解决方案1】:

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

基本上它是在告诉你,它确实知道,有一个 Mat4 和一个 Vec4 类……但它不知道更多关于它的信息,除非你告诉它去哪里看。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2011-04-26
      • 2017-05-09
      相关资源
      最近更新 更多