C++ 什么是;(游戏状态*)新游戏状态();做
线路C++ 什么是;(游戏状态*)新游戏状态();做,c++,oop,C++,Oop,线路 (GameState *) new PlayingState() 对我来说没什么意义。由于GameState*是指向类的指针,并且使用了new操作符,因此表明PlayingState()是从另一个类“新建”的对象。我的问题在这篇文章的结尾,但首先是各自类别的定义: class GameState { public: virtual void onStart(StateBasedGame &game) = 0; }; class PlayingState : publi
(GameState *) new PlayingState()
对我来说没什么意义。由于GameState*
是指向类的指针,并且使用了new
操作符,因此表明PlayingState()
是从另一个类“新建”的对象。我的问题在这篇文章的结尾,但首先是各自类别的定义:
class GameState
{
public:
virtual void onStart(StateBasedGame &game) = 0;
};
class PlayingState : public GameState, public EventSubscriber<sf::Event>
{
public:
PlayingState();
void onStart(StateBasedGame &game);
};
如
GameState gameState = new PlayerState;
显然这不是唯一的办法 如果没有进一步的背景,至少可以说这很奇怪(我无法想象这在什么背景下才有意义)
首先,您是正确的,在C++样式代码中,您将使用或根据情况在类之间进行转换。 其次,由于
PlayingState
继承自GameState
,因此指向PlayingState
(由newplayingstate()
返回)的指针可以隐式转换为GameState*
。根本不需要演员阵容
在这种情况下,作者可以简单地使用:
GameState *gs = new PlayingState();
或者更好,使用现代C++:
auto gs = std::make_unique<PlayingState>()
auto gs=std::make_unique()
(请参阅和)
PlayingState
是游戏状态的子类
所以演员阵容还行。如果需要返回基类的指针,则子类通常在其基类中转换,前提是您有用于操作的基类的代码
您还可以有以下内容:
Parent *p;
if (...) {
p = new Child1();
} else {
p = new Child2();
}
//do stuff with p
但是,将子指针转换为父指针时,不需要手动C样式转换
我能想到的唯一一个有意义的例子是,如果您想调用同时存在于子函数和父函数中的函数,而不是virtual
(在您的示例中,父函数中的所有函数都是虚拟的),那么您可以执行以下操作:
((GameState*) new PlayingState()) -> doStuff(...)
但这是一种扭曲的方式,这也会起作用:
GameState *g = new PlayingState();
g->doStuff();
简言之,如果没有更多的代码或上下文,我只能认为这是不必要的和无害的冗余
<>对于CAST运算符,C++中有几个。code>dynamic_cast
可以用于从父级转换到子级(甚至在同一子级的父级之间),并安全地检查是否可行,但在这里它没有用处
(GameState *) new PlayingState()
创建类PlayingState的新指针,然后将其强制转换为类GameState
class PlayingState : public GameState, public EventSubscriber<sf::Event> {
在Java/C中可以被看作是接口
,因为只有纯虚拟方法(virtual()=0
)
虚拟方法存储在VMT(虚拟方法表)中,对任何虚拟方法的函数调用都会通过索引调用VMT中的方法
不能像不启动接口一样启动纯虚拟类。因此GameState GameState=new GameState
无效。您还错过了游戏状态GameState
的一个指针
由于PlayingState
是GameState
的子项,因此PlayingState
只能在指针中转换为GameState
要处置对象,必须删除它<代码>删除游戏状态
即可
不要试图free
游戏状态,因为free
ing不会调用析构函数例程
编辑:
C++还支持名为RTTI
(运行时类型信息)的东西。在C++中,有<代码> COSTOSTCAST ,<代码>动态> CAST <代码>,<代码> RealTytCase和<代码> Stasic Studio<<代码> >
人们建议使用dynamic_cast
进行父子转换的原因是可以进行基本的运行时类型检查。然后可以正确处理不可比较的类型,或者创建另一个指针地狱
要dynamic\u cast
,请执行以下操作:
dynamic_cast<GameState *>(new PlayingState())
这是继承层次结构的一个转换。你说得对,我不知道他们为什么要把演员名单弄清楚。这是一种公共继承关系,在多重继承方面没有歧义。你为什么不在上下文中给我们看一行代码?“
(GameState*)new PlayingState()
做什么?”-它会杀死小猫。这是一个很好的例子,说明了如何不去做一些事情。“就像在GameState中GameState=newGameState”——你可能来自不同的编程语言,比如Java或C#?在C++中,<代码>新的t>代码>不给你一个值类型<代码> t>代码>,它给你一个指针。
class GameState
dynamic_cast<GameState *>(new PlayingState())
try {
dynamic_cast<GameState *>(new PlayingState())
} catch (std::bad_cast &oops) {
// nightmare
}