c++ - 如何在 header 中初始化静态成员

标签 c++ class static-members

Given 是一个具有静态成员的类。

class BaseClass
{
public:
    static std::string bstring;
};

String 显然必须在类之外默认初始化

std::string BaseClass::bstring {"."};

如果我将上述行与类一起包含在标题中,则会收到 symbol multiply defined 错误。它必须在单独的 cpp 文件中定义,即使使用 include guardspragma 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/

相关文章:

c++ - mpirun 无法找到指定的可执行文件

python - 如何通过类继承传递参数?

c++ - 在类中初始化时 C++ 中奇怪且不正确的数组大小行为

c++ - 静态方法/字段的继承 C++

c++ - 如何在静态函数中使用静态 vector

c++ - 有没有好的 C++ 后缀 Trie 库?

c++ - 使用带有 int 作为字符类型的 iostreams 可以吗?

c++ - 获取任何 C++ 可取消引用类型的基础类型

PHP,用于处理 MySql 和 mysql_close 问题的简单类

c# - 通用问题...从通用类调用静态方法