使用 const 成员变量索引数组
Posted
技术标签:
【中文标题】使用 const 成员变量索引数组【英文标题】:Index an array using a const member variable 【发布时间】: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;
;
【问题讨论】:
【参考方案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)
。它是运行时间常数。您刚刚承诺在初始化时不会更改它以上是关于使用 const 成员变量索引数组的主要内容,如果未能解决你的问题,请参考以下文章