【问题标题】:How to declare a constant array in class with constant class variable?如何在具有常量类变量的类中声明一个常量数组?
【发布时间】:2011-12-27 15:12:51
【问题描述】:

如何在具有常量类变量的类中声明一个常量数组?可能吗。 我不想要动态数组。

我的意思是这样的:

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

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

以上代码报错

【问题讨论】:

    标签: c++ arrays class variables constants


    【解决方案1】:

    不,不可能:只要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&lt;50&gt; x;

    请注意,现在我们有了sizeof(Test&lt;N&gt;) == sizeof(int) * (1 + N),它实际上是编译时已知值,因为对于每个NTest&lt;N&gt; 是一个不同的输入。

    【讨论】:

    • 这不只是类特定静态整数常量方法的模板版本吗?
    • @Als:嗯,是的,至于“类特定的静态整数”现在可以由作者通过模板参数指定。
    • @Als:如果您的意思是,这和您的答案几乎相同,那么不会。你可以有Test&lt;10&gt;Test&lt;20&gt;Test&lt;30&gt;等等,但在你的情况下,大小是固定的:你只能有array[size]size固定在50
    • @Nawaz:请不要打扰我把它喷到它不是的东西上。这不是关于谁的答案更好,因为你正在努力做到这一点。
    • @Als:你不同意我评论的哪一部分?
    【解决方案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)。

    【讨论】:

    • 我想用一个常量类变量而不是50。有什么办法吗?
    • 仅当它是编译时间常数时。更新了答案中的代码。
    【解决方案3】:

    您的代码会产生错误,因为编译器需要知道每个成员的数据类型的大小。当您编写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(){}
    };
    

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

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2012-10-19
      相关资源
      最近更新 更多