如何在具有常量类变量的类中声明常量数组?

3
如何在具有常量类变量的类中声明常量数组?这种情况是否可行?我不想要动态数组。
我的意思是像这样:
class test
{
    const int size;
    int array[size];
    public:
    test():size(50)
    {}
}

int main()
{
    test t(500);
    return 0;
}

上述代码出现了错误。
3个回答

5
不可能,只要“size”是一个动态变量,就不能将“array[size]”实现为静态数组。
如果你愿意,可以这样想:必须在编译时知道“sizeof(test)”(例如,考虑“test”的数组)。但是,在你的假设示例中,“sizeof(test) == sizeof(int) * (1 + size)”不是已知编译时的值!
您可以将“size”变为模板参数;那几乎是唯一的解决方案。
template <unsigned int N>
class Test
{
  int array[N];
  static const unsigned int size = N; // unnecessary really
public:
  // ...
};

用法:Test<50> x;

注意,现在我们有sizeof(Test<N>) == sizeof(int) * (1 + N),这实际上是一个编译时已知的值,因为对于每个NTest<N>都是一个不同的类型。


这不就是类特定静态整数常量方法的模板版本吗? - Alok Save
@Als:好的,是的,就在于“特定类静态整数”现在可以通过模板参数由作者指定。 - Kerrek SB
@Als:你不同意我评论的哪一部分? - Nawaz
@Nawaz:我不同意你一开始对我的评论。我认为Kerrek和我足够成熟,可以男人之间讨论问题,不需要裁判。而且,我之前的评论已经告诉你我不同意什么了,请离开。 - Alok Save
@Als:我觉得拥有几种不同的建议并不会有什么坏处!现在我感到很抱歉...毕竟,我只是复制了std::array的想法! :-S(尽管如此,我更喜欢静态常量而不是枚举。我不确定枚举的技巧来自哪里;静态常量似乎在语义上更加“正确”。也许编译器以前没有正确地实现它们?) - Kerrek SB
显示剩余8条评论

3
您是指固定大小的数组吗?您可以像这样使用std::array

#include <array>

class test
{
    static const size_t s_size = 50;
    std::array<int, s_size>   m_array;
public:
    test()
    {
    }
};

如果你想支持不同的大小,你需要使用类模板,就像这样:

#include <array>

template <size_t SIZE>
class test
{
    std::array<int, SIZE>   m_array;
public:
    test()
    {
    }
};

std:array有一个额外的好处,即与成员一起保留大小信息(不像数组会衰减为指针),并且与标准库算法兼容。

Boost还提供了类似的版本(boost::array)。


我想使用一个常量类变量代替50。有没有办法做到这一点? - Uzair Farooq
只有在编译时是常量才行。答案中的代码已更新。 - user213313

1
你的代码出现错误是因为编译器需要知道每个成员的数据类型大小。当你写下 int arr[N] 时,成员 arr 的类型是 "一个由 N 个整数组成的数组",其中 N 必须在编译时知道具体数值。
解决方法之一是使用枚举(enum):
class test
{
    enum 
    {
        size = 50
    };

    int arr[size];
   public:
    test() {}
};

另一种方法是将大小声明为类的静态常量成员:

class test
{
    static const int size = 50; 
    int arr[size];
   public:
    test(){}
};

请注意,仅允许在静态类整数中进行类内初始化!对于其他类型,您需要在代码文件中初始化它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接