2012-03-14 3 views
1

Я стартер в C++, и я пытаюсь разработать простое приложение OpenGL. Глядя на код в интернете, я нашел это:Что: :(имя метода метода) сделать в C++

::glutDisplayFunc(myPixmap::drawCallback); 

игнорировать саму функцию, я просто хотел бы знать, что делает эта строка кода. Он вызывает функцию? Я знаю, что это, наверное, глупый вопрос, но я не могу найти ответ

+1

':: + (' выглядит как какой-нибудь экзотический смайлик (ки, бедная шутка). Но ':: 'сам указывает на правильное пространство имен –

ответ

5

:: - оператор разрешения области.

Если перед ним появилось имя контейнера (пространства имен или класса), это заставляет компилятор заглянуть внутрь этого контейнера только для указанного идентификатора. Это способ ссылаться на статические члены класса вне класса.

Если оно появляется первым, без имени спереди, это означает, что он должен выглядеть в глобальном пространстве имен.

В вашем примере кода содержатся оба варианта использования. Эта строка кода вызывает ::glutDisplayFunc. Но другая функция, myPixmap::drawCallback, не называется. Его адрес сохраняется позже.

+0

@MooingDuck: Но, возможно, он говорил о' myPixmap :: drawCallback' –

+0

Хорошо, спасибо вам большое – XaitormanX

+0

@MooingDuck: Эта строка кодов вызывает ':: glutDisplayFunc'. Но другая функция , 'myPixmap :: drawCallback', не вызывается. Его адрес сохраняется позже. –

2

Да, он вызывает функцию. Ведущий «::» означает, что функция должна быть найдена в глобальном пространстве имен. Например:

namespace X { 
    void whatever() {} 
}; 

void whatever() {} 

int main() { 
    whatever(); // calls the global function 
    ::whatever(); // also calls global function 
    X::whatever(); // calls the function in the namespace 
    return 0; 
} 

Хотя whatever (без разрешения области видимости) вызывает глобальную функцию в этом случае, что зависит от контекста - в другом контексте, это может вызвать функцию в пространстве имен вместо этого. Использование ведущего :: гарантирует, что можно вызвать только глобальную функцию, а не одну в другом пространстве имен, независимо от контекста.

+0

Хорошо, это помогает понять код – XaitormanX

+0

Также стоит отметить, что если код включал объявление« using namespace X; », безоговорочный вызов станет двусмысленным. –

0

glutDisplayFunc устанавливает обратный вызов дисплея для текущего окна. Когда GLUT определяет, что нормальная плоскость для окна должна быть повторно отображена, вызывается обратный вызов дисплея для окна. Перед обратным вызовом текущее окно устанавливается в окно, которое необходимо перерисовать, и (если не зарегистрирован обратный вызов наложения), используемый слой устанавливается в нормальную плоскость. Обратный вызов дисплея вызывается без параметров.

В вашем случае myPixmap :: drawCallback, скорее всего, статическая функция метода не принимает никаких параметров,

Смежные вопросы