c++ - 如何防止静态类成员变量需要两个定义/声明?

标签 c++ class struct scope static

我不认为这是重复的,因为其他问题问的是为什么它是必要的,而不是我如何避免写两次。

对于类,我通常会引入成员变量,然后,无论出于何种原因,如果我不喜欢它们,很快就会删除它们。

使用非静态成员变量,我可以简单地将成员添加到头文件中并立即在我的代码中使用它。对于静态成员变量,我必须执行以下操作:

  • 将新成员添加到类定义中,例如static int a;.
  • 复制新成员声明。
  • 转到 .cpp 文件(如果我理解正确的话,任何 .cpp 文件都可以)。
  • 将变量粘贴到文件中。
  • 删除 static 关键字。
  • 在类型之后、变量名称之前添加类命名空间/范围。

所有这些让我想要使所有类都可实例化,并通过对象完成所有操作,即使它没有意义。

因此,即使这只是语言的要求并且没有办法解决它,是否有办法通过以某种方式使用宏来减少重复?

我还想,如果只拥有一个包含所有这些静态成员变量定义的 .cpp 文件,可能会不会更简单。看起来(我听说)静态成员变量基本上是通过类 namespace 访问的全局变量,这是否比在每个相应的 .cpp 文件中执行它更好?

最佳答案

我将为整数类型提供一个解决方案(因为您在问题中突出显示了这些类型):

struct Foo
{
    enum {Value = 123;}
};

Value 可以用作整型常量,对于 Foo 的所有实例都是相同的(类似于 static),并且不需要在源文件中定义。请注意,尽管 &Value 没有任何意义,即不存在指向枚举值的指针之类的东西。

在后来的 C++ 标准(C++11 及以上)中,您可以使用 constexpr 执行操作,但我的方法可以说更简单,而且也是一种重要的元编程技术。

(如果这不足以满足您的需求,请投反对票,我将删除。)

关于c++ - 如何防止静态类成员变量需要两个定义/声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758863/

相关文章:

Swift 嵌套的非可选结构给出了可选的

c++ - 从 URL 请求以编程方式下载谷歌街景全景图

c++ - 如何在imgui窗口中使用opengl glfw3渲染?

c++ - 如何解决 boost::shared_ptr 和使用 std::shared_ptr 之间的冲突?

c++ - Class vs Struct 仅用于数据?

JavaScript 类 : Member Defined In Constructor Undefined?

C - 转换 u16_array 中的结构,其中每个 uint16_t 仅代表一个字节

c - 访问链表中的结构

c++ - 当 Rtools 安装在 Windows 7 的非默认目录中时,在 R 中编译 Stan 模型

javascript - 在 "inherit"中,我在使用 'return' 代码时遇到问题