在C++中,我遇到了循环依赖项/不完整类型的问题。情况如下:

Stuffcollection.h

#include "Spritesheet.h";
class Stuffcollection {
    public:
    void myfunc (Spritesheet *spritesheet);
    void myfuncTwo ();
};

Stuffcollection.cpp
void Stuffcollection::myfunc(Spritesheet *spritesheet) {
    unsigned int myvar = 5 * spritesheet->spritevar;
}
void myfunc2() {
    //
}

Spritesheet.h
#include "Stuffcollection.h"
class Spritesheet {
    public:
    void init();
};

Spritesheet.cpp
void Spritesheet::init() {
    Stuffcollection stuffme;
    myvar = stuffme.myfuncTwo();
}
  • 如果保留上面显示的包含,则会出现编译器错误
    Stuffcollection.h中的spritesheet has not been declared(第4行)
    以上)。我了解这是由于循环依赖所致。
  • 现在,如果我将#include "Spritesheet.h"更改为Forward
    在Stuffcollection.h中声明class Spritesheet;,我得到了
    编译器错误invalid use of incomplete type 'struct Spritesheet'在Stuffcollection.cpp中(上面的第2行)。
  • 同样,如果我在Spritesheet.h中将#include "Stuffcollection.h"更改为classStuffcollection;,则会收到编译器错误aggregate'Stuffcollection stuffme' has incomplete type and cannot be defined在Spritesheet.cpp中(上述第2行)。

  • 我该怎么做才能解决这个问题?

    最佳答案

    您应该在Spritesheet.h中包括Stuffcollection.cpp只需在头文件而不是cpp文件中使用前向声明即可解决头文件的循环依赖性。源文件实际上没有循环依赖项。
    Stuffcollection.cpp需要知道Spritesheet类的完整布局(因为您取消引用了它),因此您需要在该文件中包含用于定义Spritesheet类的 header 。

    根据您先前的Q here ,我相信Stuffcollection头文件的类声明中使用了Spritesheet类,因此提出了上述建议的解决方案。

    09-30 08:47