2013-05-29 4 views
1

класса Заголовок:Статический доступ функция член класса

#ifndef _APP_H_ 
#define _APP_H_ 

#include "glut.h" 
#include "Declare.h" 


class App { 
private: 
    static float angle; 

public: 

    App(); 
    int OnExecute(); 
    void OnLoop(); 
    static void OnRender(); 
    bool OnInit(); 
    void OnCleanup(); 
    static void OnResize(int w, int h); 


}; 


#endif 

Мое определение OnRender является

#include "App.h" 

App::App() { 
    angle = 0.0f; 
} 

void App::OnRender() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    gluLookAt(0.0f, 0.0f, 10.0f, 
       0.0f, 0.0f, 0.0f, 
       0.0f, 1.0f, 0.0f); 
    glRotatef(angle, 0.0f, 1.0f, 0.0f); 

    glBegin(GL_TRIANGLES); 
     glVertex3f(-2.0f,-2.0f,0.0f); 
     glVertex3f(2.0f,0.0f,0.0f); 
     glVertex3f(0.0f,2.0f,0.0f); 
    glEnd(); 

    angle+=0.1f; 

    glutSwapBuffers(); 
} 

Ошибка:

1>App.obj : error LNK2001: unresolved external symbol "private: static float App::angle" ([email protected]@@0MA) 
1>App_OnRender.obj : error LNK2019: unresolved external symbol "private: static float App::angle" ([email protected]@@0MA) referenced in function "public: static void __cdecl App::OnRender(void)" ([email protected]@@SAXXZ) 

Что-то делать с тем, как я ссылки на статический переменная внутри статической функции. Если я не объявляю угол как static float angle, то я, конечно, не могу получить к нему доступ через static void OnRender(). Я должен добавить более подробную информацию. Если я не объявить его как статические, я получаю эту ошибку illegal reference to non-static member App::angle

+0

возможно дубликат [неразрешенный внешний символ на статических членов класса] (http://stackoverflow.com/questions/195207/unresolved-external-symbol-on-static-class-members) –

ответ

3

В исходном файле App.cpp вам нужно определить вашей статической переменной:

static float App::angle = 0; //0 is my test default value. use yours 

, и если вы хотите использовать angle в нестационарном методе вы можете использовать экземпляр класса с App:angle. может использовать. Например:

App::App() { 
    App::angle = 0.0f; 
} 
+0

Бинго ! Сохраняя объявление в заголовке, я добавил 'float App :: angle = 0.0f;' в App.cpp только под заголовками, и он отлично работает. Не нравится повторное использование 'static'. – Chemistpp

+1

Обратите внимание, что нет необходимости квалифицировать статический член с его именем класса. 'angle' на собственные работы, а также' App :: angle' в реализации метода (в этом случае, где нет конфликтующих имен). Вам еще нужен определитель «App ::», когда * определяет * переменную. – RobH