【问题标题】:Static function access to class member静态函数访问类成员
【发布时间】:2013-05-29 14:07:31
【问题描述】:

类头:

#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" (?angle@App@@0MA)
1>App_OnRender.obj : error LNK2019: unresolved external symbol "private: static float App::angle" (?angle@App@@0MA) referenced in function "public: static void __cdecl App::OnRender(void)" (?OnRender@App@@SAXXZ)

与我在静态函数中引用静态变量的方式有关。如果我不将角度声明为static float angle,那么我当然无法通过static void OnRender() 访问它。我必须添加更多细节。如果我不将其声明为静态,则会收到此错误illegal reference to non-static member App::angle

【问题讨论】:

标签: c++ class static-members static-functions


【解决方案1】:

在源文件App.cpp 中,您需要定义您的静态变量:

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

如果你想在非静态方法中使用angle,你可能想使用App:angle 的类实例。例如:

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

【讨论】:

  • 宾果游戏!在标题中保留声明,我在标题下方的 App.cpp 中添加了float App::angle = 0.0f;,它运行良好。不喜欢重新声明static
  • 请注意,不必用类名限定静态成员。 angle 在它自己的作品中以及在方法实现中的App::angle (在这种情况下,没有冲突的名称)。 定义变量时,您仍然需要App:: 限定符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2021-08-29
  • 2012-08-23
  • 2013-05-03
  • 1970-01-01
  • 2013-11-30
  • 2016-07-13
相关资源
最近更新 更多