根据常量整数字段设置数组字段的长度
Set array field's length based on const integer field
假设我有一个 class...
class Foo
{
public:
Foo(int size);
private:
const int size;
int data[];
};
假设在实例化时立即设置大小字段,我如何根据该大小输入设置 data
的长度?
我通常会在这里使用 std::vector
,但我正在为 Arduino 编写一个库,所以它不会运行,并且我会尽可能避免外部依赖。
你在这里运气不好,因为 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
成为 non-type 模板 class(假设您在编译时知道大小,这似乎是正在发生的事情,至少判断从你的问题)
template<std::size_t size>
class Foo
{
int data[size];
public:
Foo()
{
// constructor here
}
};
假设我有一个 class...
class Foo
{
public:
Foo(int size);
private:
const int size;
int data[];
};
假设在实例化时立即设置大小字段,我如何根据该大小输入设置 data
的长度?
我通常会在这里使用 std::vector
,但我正在为 Arduino 编写一个库,所以它不会运行,并且我会尽可能避免外部依赖。
你在这里运气不好,因为 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
成为 non-type 模板 class(假设您在编译时知道大小,这似乎是正在发生的事情,至少判断从你的问题)
template<std::size_t size>
class Foo
{
int data[size];
public:
Foo()
{
// constructor here
}
};