C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

来看代码

.h文件中
static void computePosition(const osg::Vec3d& eye,const osg::Vec3d& lv,const osg::Vec3d& up);
void setEye(const osg::Vec3d& eye);
void setRotation( const osg::Quat& rotation );

osg::Vec3d   _eye;
osg::Quat    _rotation;

.cpp文件中
void DriveManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up)
{
    osg::Vec3d lv = center-eye;

    osg::Vec3d f(lv);
    f.normalize();
    osg::Vec3d s(f^up);
    s.normalize();
    osg::Vec3d u(s^f);
    u.normalize();

    osg::Matrixd rotation_matrix(s[0],     u[0],     -f[0],     0.0,
                                 s[1],     u[1],     -f[1],     0.0,
                                 s[2],     u[2],     -f[2],     0.0,
                                 0.0,       0.0,       0.0,     1.0);

	setEye(eye);
	setRotation(rotation_matrix.getRotate().inverse());

}

void DriveManipulator::setEye(const osg::Vec3d& eye) {
	_eye = eye;
}

void DriveManipulator::setRotation(const osg::Quat& rotation) {
	_rotation = rotation;
}

但是会报错,说引用错误。
这是因为把computePosition函数定义为static 引起的。
解决办法:
computePosition函数定义为static不能更改了(我的代码需求,static必须存在),所以要在它内部使用,需要把其它函数也改成静态的。
更改如下:

.h文件
  static void setEye(const osg::Vec3d& eye);
  static void setRotation( const osg::Quat& rotation );
  
  static osg::Vec3d   _eye;
  static osg::Quat    _rotation;

.cpp文件
osg::Vec3d DriveManipulator::_eye;
osg::Quat DriveManipulator::_rotation;

关于.cpp文件那两行应该放在哪里,因为在类声明中声明了静态成员变量_eye和_rotation,需要在类定义文件(.cpp文件)中为它们分配存储空间。这两行代码不能放在任何函数内部,包括main()函数。它们应该放在所有函数外部,位于文件范围或全局范围内。
如图是我放的位置
C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用_第1张图片

然后就可以编译不报错啦!大功告成
C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用_第2张图片

你可能感兴趣的:(报错,c++,java,jvm)