Pointers c++;指向没有默认构造函数的抽象类(带参数)的指针
我试图使用一个名为Pointers c++;指向没有默认构造函数的抽象类(带参数)的指针,pointers,abstract-class,default-constructor,Pointers,Abstract Class,Default Constructor,我试图使用一个名为GameState的抽象类的指针(称为currentState),该指针随后将用于存储所述类的实现实例(例如,mainmonustate,OverworldState,BattleState,等等) GameStateabstract类的构造函数总是需要1个参数(一个可以绘制的窗口),所以我没有没有没有参数的默认构造函数。这会导致错误(没有合适的默认构造函数可用) 解决这个问题的最佳做法是什么 /* * GameState.hpp */ #ifndef GameState_
GameState
的抽象类的指针(称为currentState
),该指针随后将用于存储所述类的实现实例(例如,mainmonustate
,OverworldState
,BattleState
,等等)
GameState
abstract类的构造函数总是需要1个参数(一个可以绘制的窗口),所以我没有没有没有参数的默认构造函数。这会导致错误(没有合适的默认构造函数可用)
解决这个问题的最佳做法是什么
/*
* GameState.hpp
*/
#ifndef GameState_HPP
#define GameState_HPP
#include "stdafx.h"
#include "GameLoopObject.hpp"
/// gamestate base class
class GameState : public GameLoopObject {
public:
GameState(sf::RenderWindow & w); //: GameLoopObject(w) {}; // constructor
virtual ~GameState(); // destructor
/*
* Game Loop functions
*/
virtual void Update();
virtual void Draw();
virtual void HandleInput();
virtual void Reset();
};
#endif //GameState_HPP
/*
* GameStateManager.hpp
*/
#ifndef GameStateManager_HPP
#define GameStateManager_HPP
#include "stdafx.h"
#include "GameLoopObject.hpp"
#include "GameState.hpp"
#include<string>
#include<map>
class GameStateManager : public 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
/*
*GameState.hpp
*/
#ifndef配子状态\u水电站
#定义游戏状态\u HPP
#包括“stdafx.h”
#包括“GameLoopObject.hpp”
///配子态基类
类GameState:公共GameLoopObject{
公众:
游戏状态(sf::RenderWindow&w);//:GameLoopObject(w){};//构造函数
virtual~GameState();//析构函数
/*
*博弈循环函数
*/
虚拟空更新();
虚空绘制();
虚拟void HandleInput();
虚拟空位重置();
};
#endif//GameState\u水电站
/*
*GameStateManager.hpp
*/
#ifndef GameStateManager\U水电站
#定义GameStateManager\u HPP
#包括“stdafx.h”
#包括“GameLoopObject.hpp”
#包括“GameState.hpp”
#包括
#包括
类GameStateManager:公共GameLoopObject{
私人:
游戏状态*当前状态;
配子状态*nextState;
公众:
映射游戏状态{};//存储所有已知游戏状态的列表。
//方法
GameStateManager(sf::RenderWindow&w);
void AddGameState(std::字符串名称,GameState*state);
void SetNext(std::string name);
void SwitchState();
void HandleInput();
无效更新();
无效抽取();
无效重置();
};
#endif//GameStateManager\u水电站
改为存储指针
std::map<std::string, GameState*> gameStates{};
std::映射游戏状态{};
我没有找到我的问题的答案,因为我认为我想做的事情是不可能的
我最后做的是删除抽象类中的参数(GameLoopObject和GameState现在不需要窗口),并仅在类的实现中实现参数(窗口)(f.i.,MainMenuState(sf::referencewindow&w))
现在我可以创建我试图创建的指针,因为它们的构造函数现在是默认的。这只会导致更多错误。你确定这会有帮助吗?我在指针中存储实际的游戏状态没有问题。问题在于何时创建两个指针并请求默认构造函数。据我所知,不能创建容器来存储没有默认构造函数的类的实例。但是,您可以创建对象,然后存储指向它们的指针,这是非常常见的。另一个选项是向要存储的类添加默认构造函数。存储实际的游戏状态很好。我的问题是关于创建currentState和nextState指针。你知道吗?还是我遗漏了什么?