C ++获取对SingleTune类成员方法的访问权限,使成员访问成为不完整的类型

时间:2014-08-02 13:29:18

标签: c++ singleton

我有一个简单的单例,它将另一个类作为其成员 我尝试访问此成员类公共方法,我得到:

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'

我在这里做错了什么?

2 个答案:

答案 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_)
没有首次初始化,

条件可能为假。