我只是想了解一些我正在经历的教程代码。我正在尝试学习一些Dx11代码,我正在经历的教程中有一些类,这些类被设计为在事件发生时传递给函数的事件细节,例如:按下鼠标按钮。有一个空的基类EventArgs定义如下:
class EventArgs
{
public:
EventArgs() {};
}
其他事件(如类)继承了哪些内容。例如,他们有一个按键事件args类如下:
class KeyEventArgs : public EventArgs
{
public:
typedef EventArgs base;
KeyEventArgs(/**/)
{ }
// Rest of the class
}
我理解前提是所有事件都继承了一个基础来说“它们是一个事件类型”,但我不理解每个事件类中的typedef基础,但它们不直接使用它们。似乎一个带有KeyEventArgs参数的函数使用这个base typedef将事件传递给它自己的基类,但我不明白它是如何工作的。他们给出的例子是:
class Game
{
virtual void onKeyRelease(KeyEventArgs &e);
}
class Tutorial : public Game
{
void onKeyRelease(KeyEventArgs &e)
{
base::onKeyRelease(e);
/* Above calls Game::onKeyRelease(e) */
}
}
如果有人能够阐明上述工作的原因和方式,我将非常感激。
提前致谢。
答案 0 :(得分:2)
单词base
不是关键字,因此在class Tutorial
示例中,行base::onKeyRelease(e);
将无法编译。现在,如果你在某个地方看到它并且它确实编译了,你必须知道必须在某处用typedef
或using
语句来定义它。
使用这样的typedef
的目的是添加另一个抽象级别,以帮助人们安全地更改代码。考虑到Tutorial示例,您也可以写Game::onKeyRelease(e);
让我们考虑以下示例:
class Game
{
virtual void onKeyRelease(KeyEventArgs &e);
}
class AwsomeGame : public Game
{
virtual void onKeyRelease(KeyEventArgs &e);
}
class Tutorial : public Game
{
typedef Game base;
void onKeyRelease(KeyEventArgs &e)
{
base::onKeyRelease(e);
//equivalent to Game::onKeyRelease(e);
}
}
如果您将Tutorial基类从Game
更改为AwsomeGame
,而typedef
也已成功更改了代码而没有任何不良副作用。
不使用typedef
会强制您编写对Game
的显式调用,并且当基类更改时,您必须在已使用它的所有位置更改它。现在,如果您考虑上面的示例并将Game
更改为AwsomeGame
而不更改typedef
代码有效,但您可能会在以后遇到逻辑错误:
class Tutorial : public AwsomeGame //,public Game
{
void onKeyRelease(KeyEventArgs &e)
{
Game::onKeyRelease(e);
//code is valid, but you probably want AwsomeGame::onKeyRelease(e);
}
}
答案 1 :(得分:1)
这里没有什么魔力。其他一些语言将提供base
或类似的关键字来访问基类。
显然,这里的程序员喜欢这样,并通过提供他们自己的base
来模拟这一点。他们很可能已经写了
class Tutorial : public Game
{
void onKeyRelease(KeyEventArgs &e)
{
Game::onKeyRelease(e);
/* Above calls Game::onKeyRelease(e) */
}
}
并避免混淆(并对代码的作用发表评论)。