C++ 指针和对象

问题描述 投票:0回答:6

我在以下代码中遇到了

*
&
的困难:

声明变量并调用函数:

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*)|

我做错了什么以及如何解决?

c++ pointers
6个回答
5
投票

第一个错误:指针和对象

您需要使用指向 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
*
)。


4
投票

函数定义中的

*
表示它采用
SDL_Event
的地址。所以你需要给它一个:

SDL_Event event;
myfunc(&event);

1
投票

您还需要取消引用指针:

if (event->type == SDL_QUIT) { 
    // ...
}

我不知道,但我猜 SDL_PollEvent 也需要一个指针,所以那就是:

SDL_PollEvent(event);

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
字段的唯一方法是首先取消引用该指针。这就是
->
*
运算符为您所做的事情。


0
投票

我看到两件事:

首先,您没有向 myFunc 传递一个指针,这是您的定义所期望的。您应该:

  1. 将事件声明为指针或
  2. 使用 &event 将事件地址传递给 myFunc。

第二个问题是:

while ( SDL_PollEvent(&event) )

您的名为 event 的参数是一个指针。不需要使用地址运算符 (&) 将指针传递给 SDL_PollEvent。实际上,如果 SDL_PollEvent 需要一个指针,则在这种情况下使用 address-of 是错误的。事件已经是一个指针。通过使用address-of,您所说的是指针的地址,或指向指针的指针。


0
投票

不幸的是,所有答案都建议在调用函数时修复代码。我相信您的函数

myfunc
绝对不需要通过指针获取其参数,因为我怀疑您是否会在我们的代码中定义从
SDL_Event
派生的新类。

更好的解决方法是简单地通过

const
引用来获取参数,即:

void MyApp::myfunc(SDL_Event const& event) {
    while ( SDL_PollEvent(event) ) {
        if (event.type == SDL_QUIT) { 
            // ...
        }
    } 
}

如果您的函数不修改参数

event
,不需要为给定参数创建单独的副本,并且您不使用
SDL_event
作为基类,那么这就是正确的方法。通过引用获取参数(即不要复制)并将其限定为
const
(即“我保证不会修改它。”)。

© www.soinside.com 2019 - 2024. All rights reserved.