如何在类中使用常量类变量声明常量数组?

时间:2011-11-12 13:41:46

标签: c++ arrays class variables constants

如何在类中使用常量类变量声明常量数组?可能吗。 我不想要动态数组。

我的意思是这样的:

class test
{
    const int size;
    int array[size];
    public:
    test():size(50)
    {}
}

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

上面的代码给出了错误

3 个答案:

答案 0 :(得分: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> distinct 类型。

答案 1 :(得分:2)

你的意思是固定大小的数组?您可以像这样使用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)。

答案 2 :(得分:1)

您的代码会产生错误,因为编译器需要知道每个成员的数据类型的大小。当您编写int arr[N]成员类型arr是“N个整数数组”时,N必须在编译时知道编号。

一种解决方案是使用枚举:

class test
{
    enum 
    {
        size = 50
    };

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

另一个是将size声明为类的静态const成员:

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

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