与C+的问题+;或VisualStudio2010 我在一段时间后又重新拿起C++,而且我对某一行为有困难。我不知道这是不是VS 2010的错误,或者只是C++。我正在做一个学校项目,所以请原谅这个项目的“胡闹”。首先,我将发布相关文件及其内容: BarFly.h: #ifndef PJ_BARFLY_H #define PJ_BARFLY_H #include "BarFlyOwnedStates.h" #include "BaseGameEntity.h" #include "FSM\StateMachine.h" class BarFly : public BaseGameEntity { private: StateMachine<BarFly>* state_machine; public: BarFly(int id); }; #endif // PJ_BARFLY_H \ifndef PJ\u BARFLY\H #定义PJ_BARFLY_H #包括“BarFlyOwnedStates.h” #包括“BaseGameEntity.h” #包括“FSM\StateMachine.h” 类BarFly:公共BaseGameEntity{ 私人: 状态机*状态机; 公众: BarFly(int-id); }; #endif//PJ_BARFLY_H
BarflyownedState.h:与C+的问题+;或VisualStudio2010 我在一段时间后又重新拿起C++,而且我对某一行为有困难。我不知道这是不是VS 2010的错误,或者只是C++。我正在做一个学校项目,所以请原谅这个项目的“胡闹”。首先,我将发布相关文件及其内容: BarFly.h: #ifndef PJ_BARFLY_H #define PJ_BARFLY_H #include "BarFlyOwnedStates.h" #include "BaseGameEntity.h" #include "FSM\StateMachine.h" class BarFly : public BaseGameEntity { private: StateMachine<BarFly>* state_machine; public: BarFly(int id); }; #endif // PJ_BARFLY_H \ifndef PJ\u BARFLY\H #定义PJ_BARFLY_H #包括“BarFlyOwnedStates.h” #包括“BaseGameEntity.h” #包括“FSM\StateMachine.h” 类BarFly:公共BaseGameEntity{ 私人: 状态机*状态机; 公众: BarFly(int-id); }; #endif//PJ_BARFLY_H,c++,visual-studio-2010,C++,Visual Studio 2010,BarflyownedState.h: #ifndef PJ_BARFLYOWNEDSTATES_H #define PJ_BARFLYOWNEDSTATES_H #include "BarFly.h" #include "FSM/State.h" class BarFly; // << Line A << class CarousingState : public State<BarFly> { public: static Carousing
#ifndef PJ_BARFLYOWNEDSTATES_H
#define PJ_BARFLYOWNEDSTATES_H
#include "BarFly.h"
#include "FSM/State.h"
class BarFly; // << Line A <<
class CarousingState : public State<BarFly>
{
public:
static CarousingState *Instance();
// Some non-relevant functions
};
#endif // PJ_BARFLYOWNEDSTATES_H
\ifndef PJ\u BARFLYOWNEDSTATES\u H
#定义PJ_BARFLYOWNEDSTATES_H
#包括“BarFly.h”
#包括“FSM/State.h”
类BarFly;// 这叫做远期申报。第A行告诉编译器解析BarFlyOwnedStates。h:不用担心,会有一个名为BarFLy的类,您承诺定义后者
否则BarFlyOwnedStates.h:将必须包含barfly.h,这将引入循环依赖性
ps您是否需要在BarFly.h中包含#包含“BarflyownedState.h”
和#包含“BaseGameEntity.h”
?最好使用类转发声明来尽量减少在其他头文件中包含头文件您有两个相互包含的头文件。那不行
您的include guard将在第二个文件中隐藏该类。这就是为什么需要行A。如果这足以编译代码,只需删除该标题顶部的include
另一方面,cpp文件应该包括它使用的所有头。这可能与您在BarFly和BarflyOwnedState之间设置的循环依赖关系有关。尝试将#include“BarFly.h”放在BarFlyOwnedStates.cpp中,而不是放在标题中。问题是您有一个循环标题依赖项“BarFly.h”
和“BarFlyOwnedStates.h”
都试图包含彼此。结果是,当您包含“BarFly.h”
时,包含保护意味着BarFly
的定义在CarousingState
的定义之后,因此BarFly
在用作模板参数时未被声明
A行为“远期声明”(或仅为“声明”);它声明类存在,但不定义类。在定义该类之前,它被称为“不完整类型”,可以在某些情况下使用
一般来说,您应该避免像这样的循环依赖,因为它们会引起很多混乱。仅在实际需要时才包含头,并且尽可能使用类的前向声明
在这种情况下,您似乎可以从BarFly.h
中删除#include“BarFlyOwnedStates.h”
,并且根据State
对其模板参数所做的操作,您还可以从BarFlyOwnedStates.h
中删除#include“BarFly.h”
(将转发声明保留在A行)。您需要包含源文件中的两个标题。我知道A行是一个转发声明,但我认为没有必要,因为实际声明仅包含在上面的三行中。我没有考虑循环参考的东西,这是有道理的。
#include "BarFly.h"
BarFly::BarFly(int id) : BaseGameEntity(id) {
state_machine = new StateMachine<BarFly>(this);
state_machine->SetCurrentState(CarousingState::Instance()); // << Line B <<
}