c++ - 如何避免在类中显式指定静态数组的大小

标签 c++ arrays

我在 C++11 中有两个类 A 和 B。 A类中有一个静态数组,在B类中使用。 这是简化的问题:

// A.h
class A {
public:
    static int const a[4];
};

// A.cpp
int const A::a[4] = {1,2,3,4};

// B.h
class B {
public:
    void method();  
};

// B.cpp
void B::method() {
    for(auto const& it:a) {
        /* do something */
    }
}

它可以工作,但它需要明确定义数组大小。我想在编译时不时更改数组初始值设定项的内容,而无需手动重新定义其大小。

执行此操作的等效但更有效的方法是什么?

最佳答案

如果它是 const 你不能这样做。但是,如果它是 constexpr,您可以:

class A {
public:
    static constexpr int a[] = {1, 2, 3, 4};
};

只需将初始值设定项移动到类定义中即可。然后你可以完全省略数组大小。


如@SergeBallesta 所指出的,需要注意的是,如果您对数组进行 ODR 使用,则不能跳过定义数组的存储。您的示例显然在循环范围内执行了哪些操作(它需要指向开头和结尾的指针)。所以你的 cpp 文件仍然需要一个 const int A::a[]; 声明。

在 C++17 中,由于将内联变量添加到语言中,您至少可以制作定义 header 。

关于c++ - 如何避免在类中显式指定静态数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45440360/

相关文章:

c++ - 使用 boost::spirit 解析引用字符串

c++ - 如何仅使用 WinAPI (ATL/WTL) 在 WPF 中创建类似 Expander 控件的东西?

c++ - 使用谷歌模拟测试 C++ 时无法推断模板参数

javascript - 从对象数组创建字符串的最简单方法

基于控制台输入的 C 动态数组

c++ - 为什么我的 C++ 字符数组提前终止?

c++ - Qt:对于生产者-消费者模式中的消费者来说,这是正确的退出方式吗?

c++ - 此人如何使用 Microsoft Paint 编码 "Hello World"?

java异常处理查询

c++ - 在 C++ 中使用 static_cast 转换指向数组引用的指针是否合法?