C++ 将对象初始化为子类C++;

C++ 将对象初始化为子类C++;,c++,C++,我不知道如何说出我在寻找什么,这可能就是我无法通过搜索找到答案的原因。基本上,我有一个类,其中有另一个对象作为成员,我想将该成员初始化为一个实例,该实例是该成员类型的子类。封装类称为Game,成员变量为classtype GameState,我想将其初始化为MainMenuGameState的新实例,它扩展了GameState class MainMenuGameState : public GameState { public: MainMenuGameState();

我不知道如何说出我在寻找什么,这可能就是我无法通过搜索找到答案的原因。基本上,我有一个类,其中有另一个对象作为成员,我想将该成员初始化为一个实例,该实例是该成员类型的子类。封装类称为Game,成员变量为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++中没有。谢谢

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

MainMenuGameState::MainMenuGameState() :
    pGameState(new MainMenuGameState())
{
}

MainMenuGameState::~MainMenuGameState()
{
    delete pGameState;
}
您应该在GameState中添加虚拟析构函数,以便它能够正确清理任何资源:

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

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

MainMenuGameState::MainMenuGameState() :
    pGameState(new MainMenuGameState())
{
}

MainMenuGameState::~MainMenuGameState()
{
    delete pGameState;
}
您应该在GameState中添加虚拟析构函数,以便它能够正确清理任何资源:

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

使用指针,最好是
std::unique\u ptr

#include <memory>

class Game {
private:
    std::unique_ptr<GameState> gameState;
public:
    Game()
    : gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};
#包括
班级游戏{
私人:
std::唯一的游戏状态;
公众:
游戏()
:gameState(std::unique(newmainmenugamestate()){}
};

使用指针,最好是
std::unique\u ptr

#include <memory>

class Game {
private:
    std::unique_ptr<GameState> gameState;
public:
    Game()
    : gameState(std::unique<MainMenuGameState>(new MainMenuGameState())) { }
};
#包括
班级游戏{
私人:
std::唯一的游戏状态;
公众:
游戏()
:gameState(std::unique(newmainmenugamestate()){}
};

> p> java和C++之间的许多基本语言差异之一是所有的java对象都通过共享指针隐式引用。 C++为您提供了一个选择(因此也是一个负担),即表示对象应该由指向它们的指针的范围管理,还是由对象本身的范围管理

为了保存任何多态对象,您必须通过某种指针方式保存它(正如其他答案所提到的,最好使用unique_ptr或shared_ptr,这取决于对象的生存期是由一个所有者还是由多个所有者管理)

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

#包括
类配子态{
公众:
virtual~GameState()=默认值;
}; //将是抽象类,而不是实例化
类MainMenuGameState
:公共游戏状态
{
公众:
MainMenuGameState(){}
};
班级游戏{
私人:
std::unique_ptr gameState;//希望将其初始化为MainMenuGameState,而不仅仅是gameState;
公众:
游戏();
};
Game::Game()
:配子状态{new MainMenuGameState}
{}
使用名称空间std;
int main()
{
游戏g;
返回0;
}

> p> java和C++之间的许多基本语言差异之一是所有的java对象都通过共享指针隐式引用。 C++为您提供了一个选择(因此也是一个负担),即表示对象应该由指向它们的指针的范围管理,还是由对象本身的范围管理

为了保存任何多态对象,您必须通过某种指针方式保存它(正如其他答案所提到的,最好使用unique_ptr或shared_ptr,这取决于对象的生存期是由一个所有者还是由多个所有者管理)

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

#包括
类配子态{
公众:
virtual~GameState()=默认值;
}; //将是抽象类,而不是实例化
类MainMenuGameState
:公共游戏状态
{
公众:
MainMenuGameState(){}
};
班级游戏{
私人:
std::unique_ptr gameState;//希望将其初始化为MainMenuGameState,而不仅仅是gameState;
公众:
游戏();
};
Game::Game()
:配子状态{new MainMenuGameState}
{}
使用名称空间std;
int main()
{
游戏g;
返回0;
}

可能还需要注意的是,由于OP似乎没有这样做,所以游戏状态必须有一个虚拟析构函数。否则,当对象被破坏时,这将表现出未定义的行为。可能还需要注意的是,由于OP似乎没有这样做,该游戏状态必须有一个虚拟的析构函数。否则,当对象被破坏时,这将显示未定义的行为。最好添加析构函数以避免泄漏。最好添加析构函数以避免泄漏。