这些方法之间是否有任何区别,除了显而易见的是首先返回一个对象,第二个返回存储myclass值的地址?
我问,因为我很少看到第一种方法,在许多来源中,即使像Aeonsoft这样的大企业,我总是看到方法2被使用。但是有些程序员不喜欢&
return
,请赐教我。
static myclass& getinstance()
{
static myclass a;
return a;
}
static myclass* getinstance()
{
static myclass a;
return &a;
}
修改
哦,伙计,我忘记了第一种方法的&
答案 0 :(得分:4)
第一个没有意义,因为它返回副本。后者有点傻,因为不需要指针。
单例创建函数的常用方法是返回引用:
static Foo & getFoo()
{
static Foo impl;
return impl;
}
答案 1 :(得分:2)
第一个API更好,因为返回引用而不是指针指示对象将存在(即不需要测试NULL
)。两种方式都允许您返回多态对象(即myclass
的子类),因此没有区别。您应该尽可能返回引用。
答案 2 :(得分:1)
现在你已经纠正了第一种方法......
这只是风格问题,而人们会更喜欢。以C开头并稍后转向C ++的人可能会自然地使用指针而不考虑使用引用。
<小时/> 第一种方法实际上并不创建单例,因为它返回对象的副本。
一个简单的微妙变化可以解决这个问题:
static myclass & getinstance()
{
static myclass a;
return a;
}
答案 3 :(得分:1)
在第一种情况下,您将返回a
对象的副本。在第二个你返回一个指向它的指针。因此,第一个函数将您的单例转换为 multi -ton。
我还会修改第二个以返回引用而不是指针。
static myclass& getinstance()
{
static myclass a;
return a;
}
编辑之后,看起来您在第一个函数中返回对静态对象的引用,而不是副本。在这种情况下,没有区别,除了函数的调用者需要在第二种情况下取消引用指针。
根据经验,除非您希望能够处理nullptr
输入/返回值,否则始终接受/返回引用。
答案 4 :(得分:1)
希望以引用方式返回。
这是因为对谁拥有该对象永远不会有任何混淆。如果您通过指针返回,则用户可能会错误地认为他们需要删除指针,因为所有权语义不明确。