2014-05-21 210 views
0

我在Ubuntu Linux 12.04 LTS上使用Qt 5.2.1。 这里是我的类(.h)中的定义:C++类静态成员初始化

class RtNamedInstance 
{ 
    // [... other code here ...] 

public: 
    static int _nextInstanceNumber; 
    static QMutex _syncObj; 
}; 

,在这里我实现(的.cpp):

#include "rtnamedinstance.h" 

// Initialize static members 
int RtNamedInstance::_nextInstanceNumber = 0; 
QMutex RtNamedInstance::_syncObj(QMutex::Recursive); 

RtNamedInstance::RtNamedInstance(QString instanceName) 
{ 
    QMutexLocker(&_syncObj); // (*) 

    // [... other code here ...] 
} 

编译器出口与上线以下错误标记(*)

rtnamedinstance.cpp: In constructor 'RtNamedInstance::RtNamedInstance(QString)': rtnamedinstance.cpp:9:27: error: '_syncObj' declared as reference but not initialized

我错过了什么?

+4

首先你需要定义一个'QMutexLocker' *变量*。现在你有一个表达式来创建一个* temporary *'QMutexLocker'实例,并且一旦该表达式结束(这是立即),实例就会被破坏,并且实际上并没有在该no-op表达式之外锁定任何东西。 –

+0

@JoachimPileborg:我真的是一个愚蠢的男孩......我浪费了几分钟......但是你说得对:我忘了输入QMutexLocker变量名!现在它工作正常......谢谢! –

回答

1

正如@JoachimPileborg建议,我只是忘记键入QMutexLocker变量名......这混乱莫名其妙的编译器...

正确的代码(的.cpp):

#include "rtnamedinstance.h" 

// Initialize static members 
int RtNamedInstance::_nextInstanceNumber = 0; 
QMutex RtNamedInstance::_syncObj(QMutex::Recursive); 

RtNamedInstance::RtNamedInstance(QString instanceName) 
{ 
    QMutexLocker locker(&_syncObj); 

    // [... other code here ...] 
}