gpt4 book ai didi

c++ - 使用::operator 调用构造函数失败

转载 作者:行者123 更新时间:2023-12-02 18:22:59 26 4
gpt4 key购买 nike

我正在使用单例实现一个类来进行日志记录。

Log *Log::getInstance(){

if(!Log::log) Log::log = new Log::Log();

return Log::log;
}

这里,Log::log是指向Log类对象的指针。这段代码在 new Log::Log() 上生成错误“预期类型说明符”,但如果我省略范围解析运算符,它就可以正常工作。为什么?

最佳答案

Log是类类型。

Log::Log是一种语法结构,在某些上下文中指的是 Log的构造函数。然而,它通常不会像其他函数的名称那样命名它(例如,为了获取地址的目的)。

new需要一个类型名称。这就是简单的语法。 Log(...)在像 new Log(...) 这样的新表达式中将根据参数 ... 调用构造函数隐式构造新对象,即使 Log是它的类型名称,而不是指它的构造函数。这与非类类型的语法一致,例如 new int(1) .

因此,删除 ::Log来自Log::Log .


在 C++ 中从不显式调用构造函数。您只有 type(...) 形式的语法或type{...}它隐式调用类类型的构造函数来构造新对象。非正式地谈论“调用”构造函数可能有意义的唯一情况可能是延迟构造,其中一个构造函数“调用”其成员初始值设定项列表中的另一个构造函数。


我应该补充一点,你不应该以这种方式实现单例。您无法销毁您在 new 中创建的对象。表达式会在程序结束时自动执行,并且初始化不是线程安全的。参见例如this question以及其他用于 C++ 单例设计的内容。

关于c++ - 使用::operator 调用构造函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70629277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com