【问题标题】:Index an array using a const member variable使用 const 成员变量索引数组
【发布时间】:2019-09-08 10:51:14
【问题描述】:

我有以下课程。我想使用成员size 作为arr1 的索引,我将填写构造函数。但是,编译器不会编译并说“无法初始化可变大小的对象”。如果size 是一个常量,这怎么可能?

另一方面,arr2 使用 siz 正确填充。

class myclass {
public:
    myclass() 
    {        
        int arr1[size] = { 1, 2 };

        const size_t siz = 2;
        int arr2[siz] { 1, 2 };
    };

    const size_t size = 2;
};

【问题讨论】:

    标签: c++ arrays class indexing


    【解决方案1】:

    因为索引,真正的意思是大小,是一个非静态的、非 constexpr 的类成员,它的值在初始化之前是未知的。您需要的是编译时间常数。您可以通过几种不同的方式解决此问题,例如

    class myclass {
      enum { SIZE = 2 };  // this
     public:
      static constexpr size_t kSize = 2;  // or that
      myclass() : size(2) {
        int arr1[SIZE] = { 1, 2 };
        int arr2[kSize] = { 1, 2 };
        ...
      }
      ...
    };
    

    请记住,静态类成员的分配方式是每个类实例化都看到相同的值,并且如果 public 在没有实例化的情况下可见。此外,函数体内的每个静态变量都以这样的方式分配,每次调用此类函数时都会看到最新的值。

    【讨论】:

      【解决方案2】:

      它不起作用的原因是你可以在构造函数中更改它:

      myclass() : index(3)
      {
          //...
      }
      

      你只是默认初始化了 const 成员。

      你没有理由不在这里使用 std::Vector


      您可以通过将其设为静态来使其工作(坏主意):

      static const size_t index = 2;
      

      PS.index 在这里是个坏名字,你的意思是数组的大小而不是它的索引。

      【讨论】:

      • 好了,可以在构造函数中修改成员了。但是,据我所知,我初始化该成员的方式与您在构造函数中初始化它的方式相同。另外,我看不到如何在运行时修改该成员,所以我认为它应该可以工作。谢谢你。 Vector 看起来是一个更好的选择,但我想知道为什么这不起作用。 PS。该成员的姓名已被修改。
      • @AnselmoGPP 您可以在构造中更改它的事实,使其可变。想想这个:myclass(size_t ic) : index(ic)。它是运行时间常数。您刚刚承诺在初始化时不会更改它
      猜你喜欢
      • 2019-06-12
      • 2020-09-22
      • 2020-09-29
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2019-09-02
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多