0

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

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

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

编辑 哦,伙计们,我的错,我忘记了&第一种方法

4

5 回答 5

4

第一个没有意义,因为它返回一个副本。后者有点傻,因为不需要指针。

单例创建函数的常用方法是返回一个引用

static Foo & getFoo()
{
    static Foo impl;
    return impl;
}
于 2012-09-26T16:12:16.647 回答
2

第一个 API 更好,因为返回引用而不是指针表明对象将存在(即无需测试NULL)。两种方式都可以让您返回多态对象(即 的子类myclass),因此没有区别。如果可以,您应该更喜欢返回参考。

于 2012-09-26T16:12:20.670 回答
1

现在既然你已经纠正了第一种方法......

这只是风格的问题,哪种风格更受欢迎。开始使用 C 并后来转向 C++ 的人可能会自然而然地使用指针,甚至不会考虑使用引用。


第一种方法实际上并不创建单例,因为它返回对象的副本

一个简单的细微变化可以解决这个问题:

static myclass & getinstance()
{
    static myclass a;
    return a;
}
于 2012-09-26T16:12:09.980 回答
1

在第一种情况下,您将返回a对象的副本。在第二个中,您将返回一个指向它的指针。所以第一个函数把你的单例变成了多吨

我还将修改第二个以返回引用而不是指针。

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

编辑后,您似乎在第一个函数中返回对静态对象的引用,而不是副本。在这种情况下,除了函数的调用者需要在第二种情况下取​​消引用指针之外,没有什么区别。

根据经验,除非您希望能够处理nullptr输入/返回值,否则始终接受/返回引用。

于 2012-09-26T16:12:49.820 回答
1

更喜欢通过引用返回。

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

于 2012-09-26T16:16:19.857 回答