我有一个简单的单例,它将另一个类作为其成员 我尝试访问此成员类公共方法,我得到:
Member access into incomplete type
我的单身人士课程:
#include "SoundManager.h"
class Singleton : pSoundManager(new SoundManager())
{
public:
static
Singleton getInstance()
{
if (!instance_)
{
instance_ = new Singleton();
}
return instance_;
}
SoundManager* getSoundManager( return pSoundManager;);
private:
static Singleton* instance_;
Singleton() {};
~Singleton(){};
SoundManager* pSoundManager;
}
//保存在单身人士中的类
class SoundManager
{
public:
SoundManager(){};
~SoundManager(){};
unsigned int playEffect() {printf("effect!!");};
private:
};
现在当我尝试做
Singleton::getInstance()->getSoundManager()->playEffect() ;
我得到:
Member access into incomplete type 'SoundManager'
我在这里做错了什么?
答案 0 :(得分:1)
此代码
SoundManager* getSoundManager( return pSoundManager;);
在语法上是错误的,因为您看到的错误消息可能会产生误导。将此代码替换为
SoundManager* getSoundManager() { return pSoundManager; }
我要做的是,稍微简化getInstance()
函数(除了修复一些明显的语法错误):
#include "SoundManager.h"
class Singleton {
public:
static
Singleton& getInstance() {
static Singleton instance_;
return instance_;
}
SoundManager& getSoundManager() { return soundManager_; }
private:
Singleton() {};
~Singleton(){};
SoundManager soundManager_;
};
调用playEffect()
函数将更改为
Singleton::getInstance().getSoundManager().playEffect();
当然。
答案 1 :(得分:1)
在
class Singleton : pSoundManager(new SoundManager())
无效的C ++构造。 g ++编译器不能吃掉它。您应该将其移动到构造函数中。可能这是一个问题。
此外,您应该将instance_成员显式初始化为NULL值,因为C ++标准表明未初始化的成员包含不可预测的值。那么,
if (!instance_)
没有首次初始化,条件可能为假。