在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();
}
spritesheet has not been declared
(第4行)
以上)。我理解这是由于循环依赖。 #include "Spritesheet.h"
更改为转发
在Stuffcollection.h中声明class Spritesheet;
,我得到了
编译错误invalid use of incomplete type 'struct Spritesheet'
在Stuffcollection.cpp中(上面的第2行)。#include "Stuffcollection.h"
更改为class
Stuffcollection;
,我会收到编译错误aggregate
'Stuffcollection stuffme' has incomplete type and cannot be defined
在Spritesheet.cpp中(上面的第2行)。我该怎么做才能解决这个问题?
答案 0 :(得分:4)
您应该在Spritesheet.h
中加入Stuffcollection.cpp
只需在头文件中使用forward声明而不是cpp文件,这解决了头文件的循环依赖性。源文件实际上没有循环依赖。
Stuffcollection.cpp
需要知道类Spritesheet
的完整布局(因为您取消引用它),因此您需要在该文件中包含定义类Spritesheet
的标头。
从之前的Q here 开始,我认为类Stuffcollection
用于Spritesheet
头文件的类声明,因此也就是上面提出的解决方案。
答案 1 :(得分:2)
Spritesheet.h
不需要包含Stuffcollection.h
,因为在Stuffcollection
的类声明中没有使用Spritesheet
。将包含行的行移至Spritesheet.cpp
,您应该没问题。
答案 2 :(得分:2)
将此表单用于嵌套包含:
#ifndef STUFFCOLLECTION_H_GUARD
#define STUFFCOLLECTION_H_GUARD
class Spritesheet;
class Stuffcollection {
public:
void myfunc (Spritesheet *spritesheet);
void myfuncTwo ();
};
#endif
#include "Stuffcollection.h"
#include "Spritesheet.h"
void Stuffcollection::myfunc(Spritesheet *spritesheet) {
unsigned int myvar = 5 * spritesheet->spritevar;
}
void Stuffcollection::myfuncTwo() {
//
}
#ifndef SPRITESHEET_H_GUARD
#define SPRITESHEET_H_GUARD
class Spritesheet {
public:
void init();
};
#endif
#include "Stuffcollection.h"
#include "Spritesheet.h"
void Spritesheet::init() {
Stuffcollection stuffme;
myvar = stuffme.myfuncTwo();
}
我遵循的一般规则:
pragma