C++ 在运行时将mainclass对象的类型更改为子类

C++ 在运行时将mainclass对象的类型更改为子类,c++,sfml,C++,Sfml,首先,我为这个标题感到抱歉,我想不出一个简短的词来描述我的问题 我有一个“基于文本的冒险游戏”。我有一个叫做Game的主类,在这里我有游戏循环等等,我还有一个叫做Screen的类,还有一个叫做Screen_One和Screen_Two的子类到Screen的类,等等,我想在我的游戏中有多少不同的“Screen” 所以我在屏幕里面有一个sf::纹理和sf::精灵。Screen_One和Screen_Two都使用不同的值初始化各自构造函数中的值(在本例中,它只是一个背景纹理) 我的问题来了,我的游戏类

首先,我为这个标题感到抱歉,我想不出一个简短的词来描述我的问题

我有一个“基于文本的冒险游戏”。我有一个叫做Game的主类,在这里我有游戏循环等等,我还有一个叫做Screen的类,还有一个叫做Screen_One和Screen_Two的子类到Screen的类,等等,我想在我的游戏中有多少不同的“Screen”

所以我在屏幕里面有一个sf::纹理和sf::精灵。Screen_One和Screen_Two都使用不同的值初始化各自构造函数中的值(在本例中,它只是一个背景纹理)

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

我现在拥有的(不起作用的是这样的东西)

筛选构造器

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

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);
}
这段代码运行,但它只给了我一个白色的背景(所以基本上它什么也不画)。所以这种方法显然是行不通的,但我希望你能理解我想做什么,也许能解决或者给我另一种方法来实现同样的目标

编辑:tl;dr我可以拥有一个Screen类型的对象,然后在运行时将Screen对象分配给Screen_One或Screen_Two,例如更改背景。

在本代码中

sc = Screen_One();
正在发生的是Screen_One的屏幕部分被复制到sc,而不是整个对象,因为sc没有足够的空间容纳它。这是假设您没有重写=运算符

要解决您的问题,sc应该是指向屏幕的指针。声明将是

Screen *sc;
然后在游戏构造函数中,初始化指向Screen_One类型的新对象的指针:

sc = new Screen_One();
当您想要更改屏幕时,删除旧屏幕并使sc指向screen_Two的新实例:

delete sc;
sc = new Screen_Two();

尝试此操作后,在mWindow.draw(sc.Sprite)上出现错误;上面说“表达式必须有类类型”,你知道为什么吗?