【问题标题】:C++ class as an argument of function not working [duplicate]C ++类作为函数的参数不起作用[重复]
【发布时间】:2019-05-11 05:55:56
【问题描述】:

我正在开发一款游戏,现在我已经按照 GameState 管理器教程进行操作,但我不确定为什么代码不起作用。可能是因为它是教程中的旧版 c++,但我似乎找不到如何修复它。

 #pragma once
 #include "GameEngine.h"
 class GameState
 {
 public:

virtual void Init() = 0;
virtual void Cleanup() = 0;

virtual void SplashScreen() = 0;

virtual void Pause() = 0;
virtual void Resume() = 0;

virtual void HandleEvents(GameEngine *game) = 0;
virtual void Update(GameEngine *game) = 0;
virtual void Draw(GameEngine *game) = 0;

void ChageState(GameEngine* game,
    GameState* state) {

    game->ChangeState(state);
}

  protected: GameState() {}
};

如果我不玩 GameEgine *game 和 GameState *state 并删除使用它们的每一行,我的程序可以正常工作,我的窗口会出现,但我无法更改非常重要的游戏状态。 如果没有人有答案也没关系:)

编辑:我忘了显示 GameEngine.h 文件

#pragma once
#include "GameState.h"
#include "include.h"
class GameEngine
{
  public:
   Recources recource;
   void Init(std::string name, int x, int y);
   void Cleanup();

   void SplashScreen();

   void ChangeState(GameState* state);
   void PushState(GameState* state);
   void PopState();

   void HandleEvents();
   void Update();
   void Draw(sf::RenderWindow &widnow);

   bool Running() { return m_running; }
   void Quit() { m_running = false; }

private:
// the stack of states
std::vector<GameState*> states;

bool m_running;
};

【问题讨论】:

  • 公平地说,我们需要比这更多的代码来找出它不适合你的原因。看看你能不能买到MCVE
  • 您有循环包含,您需要在其中一个标题中转发声明一个类而不包含它
  • 您没有显示尝试使用GameStateGameEngine 的代码,那么我们如何才能告诉您该代码有什么问题?也就是说,我确实看到错误的一件事是您的两个头文件相互循环引用。你需要打破这个圈子,使用forward declarations

标签: c++


【解决方案1】:

ChangeState中的变量game(你传递给函数)必须是对象GameEngine(它有函数ChangeState,它不同于GameState的ChangeState),所以你可以调用game->ChangeState,所以如果你使用的GameEngine对象有必要的功能并且您传递正确的参数,一切都会好起来的。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多