给定的是一个具有静态成员的类。
class BaseClass
{
public:
static std::string bstring;
};
字符串显然必须是默认初始化课堂之外。
std::string BaseClass::bstring {"."};
如果我将上面的行与类一起包含在标题中,我会得到一个symbol multiply defined
错误。它必须在单独的cpp
文件,即使有include guards
or pragma once
.
没有办法在标题中定义它吗?
你不能定义一个static
成员变量不止一次。如果将变量定义放入标头中,则它将在包含标头的每个翻译单元中定义。由于包含防护仅影响一个翻译单元的编译,因此它们也无济于事。
然而,你can define static
member 功能!现在,乍一看,这似乎没有帮助,当然,该函数可以具有本地功能static
变量并返回对其中一个变量的引用,其行为几乎就像static
成员变量:
static std::string& bstring() { static std::string rc{"."}; return rc; }
本地的static
第一次调用该函数时,变量将被初始化。也就是说,构造会被延迟到第一次访问该函数为止。当然,如果你使用这个函数来初始化其他全局对象,它也可以确保对象被及时构造。如果您使用多个线程,这可能看起来像潜在的数据竞争,但事实并非如此(除非您使用 C++03):函数 local 的初始化static
变量是线程安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)