将对象初始化为子类C 的实例

Initialize an object as an instance of a subclass C++

本文关键字:实例 子类 对象 初始化      更新时间:2023-10-16

我不确定如何言语我要寻找什么,这可能就是为什么我无法通过搜索找到答案的原因。基本上,我有一个将另一个对象作为成员的类,我想将该成员作为该成员类型的子类初始化。封装类称为游戏,成员变量是clasStype gamestate,我想将其初始化为Mainmenugamestate的新实例,该实例扩展了Gamestate。

class MainMenuGameState : public GameState {
    public:
        MainMenuGameState();
};
class GameState {}; //Will be abstract class, not to be instantiated
class Game {
    private:
        GameState gameState; //Would want this to be initialized as a MainMenuGameState, not just a GameState;
    public:
        Game();
}

我可以想到如何在Java中执行此操作,而不是在C 中。谢谢!

Java和C 之间许多基本语言差异之一是所有Java对象都是通过共享指针隐式引用的。

c 为您提供了表达对象是否应通过指针范围或对象范围来管理对象的选择(以及负担)。

为了容纳任何多态对象,您必须通过某种指针来持有它(正如其他答案所述,最好使用unique_ptr或shared_ptr,具体取决于对象的寿命是由一个所有者还是由一个所有者管理)。

完整示例(已修复了警告):

#include <memory>
class GameState {
public:
    virtual ~GameState() = default;
}; //Will be abstract class, not to be instantiated
class MainMenuGameState 
: public GameState 
{
    public:
        MainMenuGameState() {}
};
class Game {
    private:
        std::unique_ptr<GameState> gameState; //Would want this to be initialized as a MainMenuGameState, not just a GameState;
    public:
        Game();
};
Game::Game()
: gameState { new MainMenuGameState }
{}

using namespace std;
int main()
{
    Game g;
   return 0;
}

使用指针,最好是std::unique_ptr

#include <memory>
class Game {
private:
    std::unique_ptr<GameState> gameState;
public:
    Game()
    : gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};

使用指针指向基类: GameState* pGameState。然后在您的构造函数中:

MainMenuGameState::MainMenuGameState() :
    pGameState(new MainMenuGameState())
{
}
MainMenuGameState::~MainMenuGameState()
{
    delete pGameState;
}

,您应该添加一个虚拟破坏者到游戏中,以便它可以正确清理任何资源:

class GameState {
public:
    virtual ~GameState() {}
}