我有以下课程。我想将成员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;
};
答案 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 };
...
}
...
};
请记住,静态类成员的分配方式是,每个类实例化都具有相同的值,并且如果公共可见,则无需实例化。同样,以这样的方式分配函数主体中的每个静态变量:每次调用该函数都可以看到最新的值。