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指针。你知道吗?还是我遗漏了什么?