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