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

标签 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
};

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

最佳答案

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

当编译器到达这一行时:

soundEngine->drop(); //C2227

它告诉您 soundEngine 必须是指向类/结构/union 的指针才能对其调用 drop()。这里的实际问题是您试图从静态函数访问非静态数据成员。

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

delete instance;

instance 的值仍设置为同一地址,此指针已无效(悬空)。在您删除之后将指针分配给 NULL 是一个很好的做法:

delete instance;
instance = NULL;

关于c++ - 为什么此代码会生成编译器错误 C2227?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344156/

相关文章:

c++ - 在 gdb 中调用 operator<<

c++ - 如何使用http请求只获取字符串名称

Qt 应用程序中的 c++ boost::thread() - 错误:函数参数太多

c++ - 用函数指针初始化另一个类中的对象指针

.net - 自动组织Visual Studio标签吗?

winforms - Windows 窗体设计器破坏了窗体布局

c++ - Visual Studio 2008 的语法检查

c++ - 名称修改和转储

visual-c++ - try/catch 和 MFC TRY/CATCH 有什么区别?

c++ - 新建 POD 的 c++ 对象(普通旧数据类型)