我在以下代码中遇到*
和&
时遇到了困难:
声明变量和调用函数:
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 *)|
我做错了什么以及如何解决?
答案 0 :(得分:5)
您需要使用指针将myfunc调用到SLD_Event对象,而不是使用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
。因为event是SLD_Event
对象的指针,所以C ++需要->
而不是.
(用于对象,即SLD_Event
没有*
)。
答案 1 :(得分:4)
函数定义中的*
表示它采用SDL_Event
的地址。所以你需要给它一个:
SDL_Event event;
myfunc(&event);
答案 2 :(得分:1)
您的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
字段的唯一方法是首先取消引用指针。这就是->
和*
运营商为您所做的事情。
答案 3 :(得分:1)
你还需要取消引用指针:
if (event->type == SDL_QUIT) {
// ...
}
我不知道,但我猜SDL_PollEvent也有一个指针,所以这将是:
SDL_PollEvent(event);
答案 4 :(得分:0)
我看到的两件事:
首先,你没有向myFunc传递一个指针,它是你的定义所期望的。你应该:
第二个问题是:
while ( SDL_PollEvent(&event) )
您的参数event是一个指针。操作符(&)的地址不是将指针传递给SDL_PollEvent所必需的。实际上,如果SDL_PollEvent期望一个指针,那么在这个上下文中使用address-of是错误的。事件已经是一个指针。通过使用address-of,您可以说指针的地址,或指向指针的指针。