与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+的问题+;或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

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 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 <<
}