C ++ указатели и объекты - PullRequest
       0

C ++ указатели и объекты

1 голос
/ 10 августа 2011

У меня проблемы с * и & в следующем коде:

Объявление переменной и вызов функции:

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

Что я делаю неправильнои как это можно исправить?

Ответы [ 5 ]

5 голосов
/ 10 августа 2011

Первая ошибка: указатели и объекты

Вам необходимо вызывать 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.Поскольку событие является указателем на объект SLD_Event, C ++ ожидает -> вместо . (который используется для объектов, то есть SLD_Event без *).

4 голосов
/ 10 августа 2011

* в определении функции означает, что он принимает адрес SDL_Event. Так что вам нужно дать ему:

SDL_Event event;
myfunc(&event);
1 голос
/ 10 августа 2011

вам также нужно разыменовать указатель:

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

, и я не знаю, но я думаю, SDL_PollEvent также принимает указатель, так что это будет:

SDL_PollEvent(event);
1 голос
/ 10 августа 2011

Ваш метод 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 голосов
/ 10 августа 2011

Я вижу две вещи:

Во-первых, вы не передаете myFunc указатель, который он ожидает по вашему определению.Вы должны либо:

  1. Объявить событие как указатель, ИЛИ
  2. Передать адрес события в myFunc, используя & event.

Вторая проблема:

while ( SDL_PollEvent(&event) )

Ваш параметр, называемый событием, является указателем.Оператор Address-of (&) не обязателен для передачи указателя на SDL_PollEvent.На самом деле, если SDL_PollEvent ожидает указатель, неправильно использовать address-of в этом контексте.событие уже является указателем.Используя address-of, вы говорите адрес указателя или указатель на указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...