【问题标题】:C++: Static member function returning an object of self static for a class with private constructorC ++:静态成员函数为具有私有构造函数的类返回自静态对象
【发布时间】:2020-07-18 17:03:14
【问题描述】:

我有一个 C++ sn-p,如下所示。 “getInstance()”函数试图返回同一类“CAbc”的静态对象。这个类有一个私有构造函数,所以这个类的对象不能被创建。

在 main() 中调用此函数时,就像在下面的 sn-p 中一样,返回的对象不会使用任何引用在 main() 中的任何地方收集。

我试图理解以下两点:

  • 这种创建静态对象并将其返回的方式是什么 在同一类类型的静态成员函数中?没有 当构造函数是私有的时创建的对象。那么这个怎么做 对象返回工作?

  • 这种不在 main() 中收集对象的方法是如何工作的?

这是在 main() 函数中调用的。

class CAbc
{
private:
CAbc() {} // HAS A PRIVATE CONSTRUCTOR
.....
public:
static CAbc& getInstance()
    {
        static CAbc _self;
            return _self;
    }
    // what does this returning a static self object mean in C++ ?
}

main()
{
CAbc::getInstance();
// not collectig this anywhere ?
}

【问题讨论】:

  • This class has a private constructor so that objects of this class can't be created. 和 There is no object created when a constructor is private.:这是错误的。类本身(或类的方法)可以调用私有方法,这意味着静态类方法可以(并且确实)创建类的实例。
  • getInstance 没有返回对象,而是返回了对该对象的引用。
  • 对于您的其他问题,不“收集”返回值并不是错误。没有什么可做的,返回的值(或引用)只是被扔掉了。你可能会问重点是什么,但这是一个不同的问题。
  • 仅供参考,您所拥有的称为Meyer's singleton

标签: c++ static singleton static-members static-functions


【解决方案1】:

正如@tkausi 所说,静态成员函数可以创建一个对象,因为它是一个成员(因此可以访问私有方法。)

这段代码的作用是拥有一个类的实例,只有一个对象 (_self) 并将其返回以供使用。

为什么没有人得到返回值?因为调用只是为了创建实例。如果您不调用该函数,则不会创建 _self 对象。

class CAbc
{
private:
    CAbc() { cout << "creating" << endl; }
public:
static CAbc& getInstance()
    {
        static CAbc _self;
            return _self;
    }
};

int main() {
    cout << "Begin" << endl;

    //CAbc::getInstance();
}

注释掉对getInstance 的调用后,您将看不到“正在创建”的输出。

如果您取消注释呼叫,您会看到:

Begin
creating

一旦创建,函数将始终返回相同的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2013-01-16
    • 2017-11-23
    相关资源
    最近更新 更多