在运行时将主类对象的类型更改为子类

Change type of mainclass object during runtime to subclass

本文关键字:类型 子类 对象 运行时      更新时间:2023-10-16

首先,我对标题感到抱歉,我无法用简短的话来描述我的问题。

我拥有的是一款"基于文本的冒险游戏"。我有一个名为Game的主类,其中包含游戏循环等,我还有一个名为Screen的类,以及Screen的子类Screen_One和Screen_Two等等,用于在我的游戏中创建许多不同的"Screen"。

所以我在Screen里面有一个sf::Texture和sf::Sprite。Screen_One和screen_two都在各自的构造函数中用不同的值初始化它们(在本例中它只是一个背景纹理)。

我的问题来了,我的Game类有一个Screen类型的对象,我想根据我在游戏中的位置来改变它,所以基本上我想在Game构造函数中将Screen初始化为Screen_One对象,当我在游戏中前进到Screen_Two时,我想将Screen对象更改为Screen_Two对象,从而为我当前所在的屏幕获得正确的背景。

我现在拥有的(不能工作的是像这样的东西)

Screen_One的构造函数

Screen_One::Screen_One(void)
{
    Texture.loadFromFile("filename.png"); // background for screen_one
    Sprite.setTexture(Texture);
}

在Game类中:

Game::Game(void) : mWindow(sf::VideoMode(640, 480), "Game") // Game constructor
{
    sc = Screen_One(); // sc is a declared like "Screen sc" in Game.h
}
void Game::render() // this function runs inside the game loop
{
    //draw some stuff
    mWindow.draw(this->sc.Sprite);
}

这段代码运行,但它只是给我一个白色的背景(所以基本上它什么也没画)。所以这种方法显然行不通,但我希望你能理解我想做什么,也许可以修复或给我另一种方法来实现同样的事情。

我可以有一个Screen类型的对象,然后在运行时将Screen对象分配给Screen_One或Screen_Two,以便例如更改背景吗?

在此代码中

sc = Screen_One();

所发生的事情是Screen_One的Screen部分被复制到sc中,而不是整个对象,因为sc没有足够的空间容纳它。这是假设您没有覆盖=操作符。

要解决这个问题,sc应该是一个指向Screen的指针。声明应该是

Screen *sc;

然后在Game构造函数中,将指针初始化为Screen_One类型的新对象:

sc = new Screen_One();

当您想要更改屏幕时,删除旧屏幕并使sc指向Screen_Two的新实例:

delete sc;
sc = new Screen_Two();