我按照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();
实现应该是什么样的?我想返回歌曲成员对象,如果它已经存在,否则创建它而不是返回它。我知道我添加的链接中有一个实现,但我不确定它是否符合我的要求而且我不太了解它。
另外,有人可以解释这两行是什么以及=
运算符被覆盖的原因吗?
Song(Song const&); // don't implement
void operator = (Song const&); //don't implement
答案 0 :(得分:1)
实施在你引用的答案中:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
该实例是静态的,因此它会在getInstance()
函数的第一次调用时实例化。
有关详细信息,请参阅this related SO question。
关于第二个问题的说明。第一个是复制构造函数:
Song(Song const&);
如果要初始化对象以获取另一个对象的值,则需要它:
Song a;
Song b = a; // calls copy constructor
第二个是赋值运算符:
void operator=(const Song&);
需要为现有实例分配值:
Song a;
Song b;
b = a; // calls assignment operator.
请注意,赋值运算符的标准返回值是引用:
Song& operator=(const Song&);
答案 1 :(得分:1)
那我的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;
答案 2 :(得分:0)
要回答第二个问题,这两行将复制构造函数和赋值运算符声明为私有,这样就无法调用它们。如果没有这两行,编译器将生成这些行的默认实现,客户端可以创建副本,从而破坏Singleton
模式的目的。