给定的是一个带有静态成员的类。
class BaseClass
{
public:
static std::string bstring;
};
显然,字符串必须在类外部进行默认初始化。
std::string BaseClass::bstring {"."};
如果我在类的标题中包含上述行,则会收到symbol multiply defined
错误消息。cpp
即使使用include guards
或,也必须在单独的文件中定义它pragma once
。
有没有一种方法可以在标头中定义它?
您不能static
多次定义成员变量。如果将变量定义放在标头中,它将在包含标头的每个转换单元中进行定义。由于包含保护仅影响一个翻译单元的编译,因此它们也无济于事。
但是,您可以定义static
成员函数!现在,乍看之下似乎没有什么帮助,当然,该函数可以具有局部static
变量,并且返回对其中一个的引用的行为几乎类似于static
成员变量:
static std::string& bstring() { static std::string rc{"."}; return rc; }
static
首次调用此函数时,将初始化局部变量。即,构造被延迟直到第一次访问该功能。当然,如果使用此函数初始化其他全局对象,则还可能确保该对象及时构建。如果使用多个线程,这看起来可能是潜在的数据争用,但事实并非如此(除非您使用C ++ 03):函数局部static
变量的初始化是线程安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句