为什么此代码会生成编译器错误C2227?

时间:2013-05-02 17:27:53

标签: c++ visual-studio-2008 visual-c++ compiler-errors static-members

我正在努力将我当前的游戏引擎与irrKlang声音引擎集成,并且正在处理持续性错误。简化为:

fsCore.h

class fsEngine
{
public:
    static fsEngine *getInstance();
    static void release();
    ;
private:
    static fsEngine *instance;
    static fsBool exists;
    irrklang::ISoundEngine *soundEngine;
};

fsCore.cpp

#include "fsCore.h"
void fsEngine::release()
{
    exists = false;
    delete instance;
    soundEngine->drop(); //C2227
};

引擎正确声明,单例按预期执行。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

可在此处找到C2227的说明:Compiler Error C2227

编译器到达此行时:

soundEngine->drop(); //C2227

它告诉你soundEngine必须是指向class / struct / union的指针才能在其上调用drop()。这里的实际问题是您尝试从静态函数访问非静态数据成员。

另请注意,delete不会更改指针本身的值,因此在执行此行之后:

delete instance;

instance的值仍然设置为相同的地址,此指针变为无效(悬空)。最好在NULL之后将delete指定给指针:

delete instance;
instance = NULL;