2013-05-29 99 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

宾果!在头文件中保留字符,我在头文件的App.cpp中添加了'float App :: angle = 0.0f;',它的工作原理非常完美。虽然不喜欢重新声明'static'。 – Chemistpp

+1

请注意,不需要用类名限定静态成员。在它自己的作品中使用'angle'以及方法实现中的'App :: angle'(在这种情况下,没有冲突的名称)。 *定义变量时,您仍然需要'App ::'限定符。 – RobH