我正在按照first answer here.中描述的方式实现Singleton getInstance()方法返回一个引用,但是我不确定如何创建新实例并在创建并返回之前检查它是否已经存在。

class Song {

private:
    Song song;
    Song();
    Song(Song const&); // don't implement
    void operator = (Song const&); //don't implement

public:
    static Song &getInstance();
}


那么我的getInstance();实现应该是什么样的?我想返回歌曲成员对象(如果已经存在),否则创建它,然后返回它。我知道我添加的链接中有一个n实现,但是我不确定它是否可以实现我想要的功能,而且我不太了解。

另外,有人可以解释这两行是什么意思,为什么=运算符会被覆盖?

    Song(Song const&); // don't implement
    void operator = (Song const&); //don't implement

最佳答案

那我的getInstance()应该怎样?实现是什么样的?我想返回歌曲成员对象(如果已经存在),否则创建它,然后返回它。


这正是您链接的代码所做的。引用该答案:

static S& getInstance()
{
    static S    instance; // Guaranteed to be destroyed.
                          // Instantiated on first use.
    return instance;
}


如评论所述,它是在首次使用时实例化的;这就是函数作用域中的静态变量的工作方式。

与实现Singleton反模式的这种特定尝试相关的致命陷阱是,可以在销毁它之后(例如从另一个静态对象的析构函数中)对其进行访问。


  另外,有人可以解释这两行的含义以及为什么=运算符会被覆盖吗?


这些是为了防止复制对象。复制可以使用复制构造函数(创建新对象)或复制分配运算符(覆盖现有对象)完成。如果将这些声明为私有且未实现,则无法复制该实例。在C ++ 11中,可以通过删除它们来使其更加明确:

Song(Song const&) = delete;
void operator = (Song const&) = delete;

关于c++ - 检查实例是否存在,并在Singleton中获取引用getInstance();,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11670796/

10-11 00:14