Given 是一个具有静态成员的类。
class BaseClass
{
public:
static std::string bstring;
};
String 显然必须在类之外默认初始化。
std::string BaseClass::bstring {"."};
如果我将上述行与类一起包含在标题中,则会收到 symbol multiply defined
错误。它必须在单独的 cpp
文件中定义,即使使用 include guards
或 pragma once
。
没有办法在header中定义吗?
最佳答案
您不能多次定义 static
成员变量。如果将变量定义放入标题中,它将在包含标题的每个翻译单元中定义。由于包含保护只影响一个翻译单元的编译,它们也无济于事。
但是,您可以定义static
成员函数!现在,乍一看,它可能没有帮助,当然,该函数可以具有本地 static
变量并返回对其中一个变量的引用几乎就像 static
成员变量:
static std::string& bstring() { static std::string rc{"."}; return rc; }
本地 static
变量将在第一次调用此函数时被初始化。也就是说,构造会延迟到第一次访问该函数。当然,如果你使用这个函数来初始化其他全局对象,它也可以确保对象被及时构造。如果您使用多个线程,这可能看起来像潜在的数据竞争,但事实并非如此(除非您使用 C++03):函数本地 static
变量的初始化是线程安全的。
关于c++ - 如何在 header 中初始化静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18860895/