Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是;(游戏状态*)新游戏状态();做_C++_Oop - Fatal编程技术网

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
}