使用const成员变量索引数组

时间:2019-09-08 10:51:14

标签: c++ arrays class indexing

我有以下课程。我想将成员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;
};

2 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为您可以在构造函数中对其进行更改:

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

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

您没有理由不在此处使用 std::Vector


您可以通过使其静止(坏主意)来使其工作:

static const size_t index = 2;

PS。index在这里不好称呼,您的意思是数组的大小而不是它的索引。

答案 1 :(得分: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 };
    ...
  }
  ...
};

请记住,静态类成员的分配方式是,每个类实例化都具有相同的值,并且如果公共可见,则无需实例化。同样,以这样的方式分配函数主体中的每个静态变量:每次调用该函数都可以看到最新的值。