gpt4 book ai didi

C++ 状态机,具有语法不正确的成员值的继承类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:58 25 4
gpt4 key购买 nike

我不知道我的问题标题是否有意义,所以提前为此道歉。所以...我正在尝试为我尝试使用 C++ 和 SFML 制作的小游戏实现状态机。

我有一个 GameLoopObject 抽象类,它需要一个 renderwindow 参数并且有这些虚拟方法:updatedrawhandleinputreset

然后我有一个 GameState 抽象类,它继承自 GameLoopObject,但没有添加任何新内容,所以它与 GameLoopObject 基本相同,现在。

最后,我有一个 GameStateManager 类,它也继承自 GameLoopObject 并且应该处理我的游戏状态。

现在我的问题是我想在我的 GameStateManager 中使用一个 GameState currentState 和一个 nextState 成员变量>,但我似乎无法找到正确的方式/语法来声明这些并在之后使用它们。我宁愿将它们留空(如果在 C++ 中可能的话),因为在生成 GameStateManager 对象后,GameState 对象会立即存储在其中。

基本上,我想做的是类似这样的事情:

GameStateManager(sf::RenderWindow & w) : 
GameLoopObject(w),
currentState(new GameState(w)),
nextState(new GameState(w));

这给了我一个“类“GameLoopObject”不存在默认构造函数”

这是我的其余代码:

/*
* GameStateManager.hpp
*/

#ifndef GameStateManager_HPP
#define GameStateManager_HPP

#include "stdafx.h"
#include "GameLoopObject.hpp"
#include "GameState.hpp"
#include<string>
#include<map>

class GameStateManager : GameLoopObject {
private:
GameState currentState;
GameState nextState;
public:
std::map<std::string, GameState> gameStates{}; // list where all known gamestates are stored.

// methods
GameStateManager(sf::RenderWindow & w);

void AddGameState(std::string name, GameState * state);
void SetNext(std::string name);
void SwitchState();
void HandleInput();
void Update();
void Draw();
void Reset();
};

#endif //GameStateManager_HPP



/*
* GameStateManager.cpp
*/
#include "stdafx.h"
#include "GameStateManager.hpp"

GameStateManager::GameStateManager(sf::RenderWindow & w)
// : GameLoopObject(w)
{
GameState currentState(w);
GameState nextState(w);
}

void GameStateManager::AddGameState(std::string name, GameState * state)
{
gameStates.insert(std::make_pair(name, * state));
}

void GameStateManager::SetNext(std::string name)
{
//check if user wants to exit (close window with X)
if (gameStates.count(name))
{
nextState = gameStates[name];
}
}

void GameStateManager::SwitchState()
{
if (currentState != nextState)
{
currentState = nextState;
}

}

void GameStateManager::HandleInput()
{
// if(currentState != null)
currentState.HandleInput();
}

void GameStateManager::Update()
{
// if(currentState != null)
currentState.Update();
}

void GameStateManager::Draw()
{
// if(currentState != null)
currentState.Draw();
}

void GameStateManager::Reset()
{
// if(currentState != null)
currentState.Reset();
}

最佳答案

我看到您这里有两个问题,这两个问题都源于您无法声明抽象类的实例。类(class)成员应该是GameState指针。当您调用 new GameState 时,您也会遇到同样的问题。 , 这里没有可用的构造函数 GameState是抽象的。

我不确定你的 GameStateManager是当前和下一个状态的所有者。在这种情况下,您应该将成员的类型更改为 std::unique_ptr<GameState> ,否则只需使用 GameState* .

如果这些成员不拥有状态,您的构造函数不需要创建新的 GameState 对象来初始化这些成员,在这种情况下,您将传递一个指向现有 GameState 的指针。 .但是,如果他们这样做,您必须调用 new ConcreteGameState其中 ConcreteGameStateGameState 的一些派生类那不是抽象的。

编辑:查看您的成员函数,您几乎肯定想要一个原始指针。

编辑 2:注意到您目前正在私自继承自 GameLoopObject ,您应该通过添加关键字将其更改为公开:

class GameStateManager: public GameLoopObject

关于C++ 状态机,具有语法不正确的成员值的继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com