我在以下代码中遇到了
*
和 &
的困难:
声明变量并调用函数:
SDL_Event event;
myfunc(event);
功能:
void MyApp::myfunc(SDL_Event* event) {
while ( SDL_PollEvent(&event) ) {
if (event.type == SDL_QUIT) {
// ...
}
}
}
编译器: 错误:没有匹配的函数可用于调用“MyApp::myfunc(SDL_Event&)” 注意:候选人是: void MyApp::myfunc(SDL_Event*)|
我做错了什么以及如何解决?
您需要使用指向 SLD_Event 对象的 pointer 来调用 myfunc,而不是使用 SLD_Event 对象本身进行调用:
myfunc(&event);
在对象(或变量)前面放置
&
告诉编译器您想要该对象的内存地址(即所谓的指向它的指针)。
在指向对象的指针前面放置一个
*
告诉编译器您想要指针指向的内存地址的内容(即对象或变量本身)
您收到的编译器错误表明编译器无法找到名称为 myfunc 的函数,该函数接受(引用)SLD_Event 对象。这是正确的,因为(唯一)可用的 myfunc 函数需要一个指向 SLD_Event 对象的指针作为其参数。
您遇到的第二个(独立于第一个)编译器错误 (
error: cannot convert 'SDL_Event**' to 'SDL_Event*' for argument '1' to 'int SDL_PollEvent(SDL_Event*)'
) 表明您放入 SLD_PollEvent
函数中的变量类型与预期类型不兼容,并且无法自动转换。
因为您在该函数调用中的
&
变量之前添加了 event
,所以您基本上是要求获取指向事件对象的内存位置的指针。这是完全合法的 C 代码,但不是您想要的,因为 SLD_EventPoll
函数期望事件对象的指针(其类型为 SLD_Event *
)。
因此,要解决第二个错误,请将行更改为:
while ( SDL_PollEvent(event) ) {
(注意已删除的
&
)
代码中的第三个错误是
event.type
。因为事件是 SLD_Event
对象的指针,所以 C++ 需要 ->
而不是 .
(用于对象,即没有 SLD_Event
的 *
)。
函数定义中的
*
表示它采用SDL_Event
的地址。所以你需要给它一个:
SDL_Event event;
myfunc(&event);
您还需要取消引用指针:
if (event->type == SDL_QUIT) {
// ...
}
我不知道,但我猜 SDL_PollEvent 也需要一个指针,所以那就是:
SDL_PollEvent(event);
您的
myfunc()
方法采用指向 SDL_Event
(即 SDL_Event*
)的指针,而不是 SDL_Event
实例。尝试做:
SDL_Event event;
myfunc(&event);
另请注意,除非
SDL_PollEvent()
需要 SDL_Event**
类型的参数,否则不需要 &
。你可以这样做:
while ( SDL_PollEvent(event) ) {
if (event->type == SDL_QUIT) {
// ...
}
}
...因为您已经有一个指向
SDL_Event
的指针。另请注意,我已将您的 event.type
替换为 event->type
((*event).type
也有效)。因为此时 event
是一个指针,所以访问实际 type
实例的 SDL_Event
字段的唯一方法是首先取消引用该指针。这就是 ->
和 *
运算符为您所做的事情。
我看到两件事:
首先,您没有向 myFunc 传递一个指针,这是您的定义所期望的。您应该:
第二个问题是:
while ( SDL_PollEvent(&event) )
您的名为 event 的参数是一个指针。不需要使用地址运算符 (&) 将指针传递给 SDL_PollEvent。实际上,如果 SDL_PollEvent 需要一个指针,则在这种情况下使用 address-of 是错误的。事件已经是一个指针。通过使用address-of,您所说的是指针的地址,或指向指针的指针。
不幸的是,所有答案都建议在调用函数时修复代码。我相信您的函数
myfunc
绝对不需要通过指针获取其参数,因为我怀疑您是否会在我们的代码中定义从SDL_Event
派生的新类。
更好的解决方法是简单地通过
const
引用来获取参数,即:
void MyApp::myfunc(SDL_Event const& event) {
while ( SDL_PollEvent(event) ) {
if (event.type == SDL_QUIT) {
// ...
}
}
}
如果您的函数不修改参数
event
,不需要为给定参数创建单独的副本,并且您不使用 SDL_event
作为基类,那么这就是正确的方法。通过引用获取参数(即不要复制)并将其限定为 const
(即“我保证不会修改它。”)。