单例方法之间的区别

时间:2012-09-26 16:09:56

标签: c++ singleton

这些方法之间是否有任何区别,除了显而易见的是首先返回一个对象,第二个返回存储myclass值的地址? 我问,因为我很少看到第一种方法,在许多来源中,即使像Aeonsoft这样的大企业,我总是看到方法2被使用。但是有些程序员不喜欢& return,请赐教我。

static myclass& getinstance()
{
    static myclass a;
    return a;
}

static myclass* getinstance()
{
    static myclass a;
    return &a;
}

修改 哦,伙计,我忘记了第一种方法的&

5 个答案:

答案 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)

希望以引用方式返回。

这是因为对谁拥有该对象永远不会有任何混淆。如果您通过指针返回,则用户可能会错误地认为他们需要删除指针,因为所有权语义不明确。