假设我有一个班级......
class Foo
{
public:
Foo(int size);
private:
const int size;
int data[];
};
假设在实例化时立即设置了size字段,如何根据该大小输入设置data
的长度?
我通常会在这里使用std::vector
,但我正在为Arduino编写一个库,因此我不会飞,而且如果可以的话,我会尝试避免外部依赖。
答案 0 :(得分:6)
这里运气不好,因为C ++必须在编译时知道数组的大小(换句话说,size
必须是常量表达式)。您可以选择使用动态分配
int* data;
然后在构造函数初始化列表中使用new int[size];
进行分配,或者更好的是,使用std::unique_ptr<>
(C ++ 11或更高版本),这是一个围绕原始指针的光包装并删除其分配的内存在范围退出时,您不必手动delete[]
class Foo
{
private:
std::unique_ptr<int[]> data; // no need to manually delete
public:
Foo(int size): data{new int[size]} {}
};
第三个选项是使Foo
成为非类型模板类(假设您知道编译时的大小,这似乎正在发生,至少从您的问题判断)
template<std::size_t size>
class Foo
{
int data[size];
public:
Foo()
{
// constructor here
}
};