c++指针和对象

C++ pointers and objects

本文关键字:对象 指针 c++      更新时间:2023-10-16

我在以下代码中遇到*&的困难:

声明变量和调用函数:

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对象的指针来调用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是一个指针,所以访问实际SDL_Event实例的type字段的唯一方法是首先解引用该指针。这就是->*运算符为您所做的。

我看到了两件事:

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

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

第二个问题是:

while ( SDL_PollEvent(&event) )

你的参数event是一个指针。将指针传递给SDL_PollEvent时,不需要地址操作符(&)。实际上,如果SDL_PollEvent期望一个指针,在这个上下文中使用address-of是错误的。事件已经是一个指针。通过使用address-of,你说的是指针的地址,或者指针指向指针的地址。