在运行时将主类对象的类型更改为子类
Change type of mainclass object during runtime to subclass
首先,我对标题感到抱歉,我无法用简短的话来描述我的问题。
我拥有的是一款"基于文本的冒险游戏"。我有一个名为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();
- C ++类型特征:确保子类实现方法
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 附加类型安全的子类std::string
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 将方法参数类型更改为子类中的派生类
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 在子类上调用模板化静态方法时获取类的类型名
- 使用子类中的类型定义扩展模板类
- 当函数返回类型为父类时,如何返回子类的对象?
- 模型类/子类,其中子类类型在C++中先验未知
- C 模板继承.子类应用固定类型替换基类中的类型
- 可以将指向子类的指针分配给Varibale的超级类型
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- 类型的C 参数与父母和子类的类型参数不相容
- 具有不同模板类型的子类的多态性
- 如何在尝试为某些非类型值实例化模板子类方法时产生编译器错误
- 制作可以存储子类对象的超类类型的向量
- 非标量类型子类错误