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

时间:2017-08-01 14:17:36

标签: 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 */
    }
}

它可以工作,但它需要显式定义数组大小。我想在编译时不时更改数组初始化程序的内容,而无需手动重新定义其大小。

这样做的等效但更有效的方法是什么?

1 个答案:

答案 0 :(得分:10)

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

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

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

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

在C ++ 17中,由于内联变量被添加到语言中,您至少可以创建定义标题。