使用::运算符调用构造函数失败



我正在使用singleton实现一个用于日志记录的类。

Log *Log::getInstance(){
if(!Log::log) Log::log = new Log::Log();

return Log::log;
}

这里,Log::log是指向Log类的对象的指针。该snnipt代码生成错误";期望的类型说明符";在新的Log:Log((上,但如果我提交了范围解析运算符,它可以正常工作。为什么?

Log是类类型。

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

new需要一个类型名称。这只是语法。类似new Log(...)新表达式中的Log(...)将根据参数...隐式调用构造函数来构造新对象,即使Log是其类型名称,而不是引用其构造函数。这与非类类型(如new int(1)(的语法一致。

因此,请从Log::Log中删除::Log


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


我应该补充一点,您不应该以这种方式实现单例。您无法在程序结束时自动销毁在new表达式中创建的对象,并且初始化不是线程安全的。例如,请参阅这个问题和其他关于C++单例设计的问题。

相关内容

  • 没有找到相关文章

最新更新