我正在使用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++单例设计的问题。