繁体   English   中英

带有私有构造函数的 C++ 静态类成员

[英]C++ static class member with private constructor

为什么在这种情况下可以使用私有构造函数? 我无法向自己解释。 在这种情况下,我从外部初始化类字段(其类型是相同的类),因为它是静态的。

Edit1 :我使用 C++ 17 (gcc 11.2)。

#include <iostream>

using namespace std;

class MainMenu {
public:
    MainMenu(const MainMenu& other) = delete;
    MainMenu& operator=(const MainMenu& other) = delete;
    static MainMenu& GetInstance() { return _instance; }

private:
    static MainMenu _instance;

    MainMenu() { cout << __PRETTY_FUNCTION__ << endl;}
};

// HERE HERE HERE!!
MainMenu MainMenu::_instance = MainMenu(); // Or just MainMenu MainMenu::_instance;

int main() {
    MainMenu::GetInstance();
    return 0;
}

结果

MainMenu::MainMenu()

Process finished with exit code 0

我会使用以下心智模型:

一种。 请注意,您正在实例化变量(它在类的范围内将具有不完整的类型,因此它不能与类的范围内联),而不是实际(重新)分配它

它已经在类的范围内声明为全局/静态,因此从技术上讲,在类中调用构造函数。 这很好,即使构造函数是私有的,因为它正是从私有可访问范围调用的。 诚然,外面的定义看起来不那么重要,但这并不重要,因为声明指定了它的范围。

摘自 C++17 标准:

12.2.3.2 静态数据成员[class.static.data]

2 非内联静态数据成员在其类定义中的声明不是定义,并且可能是除 cv void 之外的不完整类型。 未在类定义中内联定义的静态数据成员的定义应出现在包含成员类定义的命名空间范围内。 在命名空间范围的定义中,静态数据成员的名称应使用 :: 运算符由其类名限定。 静态数据成员定义中的初始化表达式在其类的范围内(6.3.7)

这个例子正是你的情况:

class process {
  static process* run_chain;
  static process* running;
};

process* process::running = get_main();
process* process::run_chain = running;

非常欢迎来自 C++ 标准的任何其他引文以更好的方式解释它。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM