【问题标题】:Private member for singleton class单例类的私有成员
【发布时间】:2012-07-29 16:54:41
【问题描述】:

我有一个单例类,我需要一个私有成员。我希望该成员为空,直到我使用我的 setter 方法设置正确的数据。

class PlaybackHelper{
private:
    PlaybackHelper();
    PlaybackHelper(PlaybackHelper const&);
    void operator=(PlaybackHelper const&);

    playback_type type;

    Note note;
public:
    void setPlaybackType(playback_type aType);
    static PlaybackHelper &getInstance();

};

Xcode 在我的实现文件(我正在实现我的私有构造函数)中给我一个错误,说我应该初始化我的成员:

PlaybackHelper::PlaybackHelper(){

}

error: Semantic Issue: Constructor for 'PlaybackHelper' must explicitly initialize the member 'note' which does not have a default constructor

我不明白为什么我无法做到这一点(特别是因为它没有给我以相同方式工作的 playback_type type;(枚举)成员的任何错误)我可以做些什么来离开我的请注意成员为空,直到我准备好为其赋值?

【问题讨论】:

  • Node 类型的对象没有默认构造函数,显然是在读取错误文本后。不是吗?

标签: c++ singleton initialization member default-constructor


【解决方案1】:

playback_type 是一个普通的旧数据,因此缺少初始化 type 只会使其未初始化;但是,class Note 的非默认构造函数是定义的,因此如果你没有定义它,它的默认构造函数不会自动生成。 要解决它,您可以

  1. 使用您定义的(其中一个)非默认构造函数的参数对其进行初始化。

    PlaybackHelper::PlaybackHelper() : note(/*...*/) { }

  2. class Note定义一个默认构造函数

【讨论】:

    【解决方案2】:

    错误消息很清楚 - Note 没有默认构造函数。要么创建一个,要么使用现有的构造函数在初始化列表中初始化Note

    我希望该成员为空,直到我使用我的 setter 方法设置正确的数据。

    你不能。 noteplayback_type 在您创建对象时都存在。

    【讨论】:

      【解决方案3】:

      由于Note没有默认构造函数(即无参数构造函数),你必须在成员初始化列表中将其初始化为:

      PlaybackHelper::PlaybackHelper() : note(/*..args...*/) 
      {                              //^^^^^^^^^^^^^^^^^^^^member initialization
      
      }
      

      根据Note 构造函数的要求,将适当的参数传递给note。对于PlaybackHelper 的其他构造函数,您也必须这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 2012-07-23
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多