如何使数组的大小取决于构造函数参数?
Posted
技术标签:
【中文标题】如何使数组的大小取决于构造函数参数?【英文标题】:How can I make the size of an array dependent on a constructor parameter? 【发布时间】:2017-05-13 09:27:32 【问题描述】:在队列下方的不正确代码中,我试图让结构“bar”保存一个长度为ARR_SIZE
的数组。我希望这个变量依赖于我在构建过程中给它的参数。
因此,在一种情况下,当我构造foo
时,我希望结构中的数组的长度为8
,或者在另一种情况下,我想让它成为1000
的数组。如何做到这一点?
我知道您可以将ARR_SIZE
设为static
变量,但这是否意味着foo
类的每个实例的数组大小都相同?
有没有办法让foo
的每个实例的这个参数都不同?
class foo
private:
int ARR_SIZE;
public:
foo();
foo(int arr_size);
~foo();
struct bar
int arrInt[ARR_SIZE];
bar* next;
;
void enqueue(int a);
int dequeue();
;
foo::foo()
ARR_SIZE = 8;
foo::foo(int arr_size)
ARR_SIZE = arr_size;
【问题讨论】:
您可以使用std::vector<int>
来代替。当你这样做时,它不会起作用。
标准 C++ 中没有 VLA。请改用std::vector
。
如果大小总是可以在编译时计算,它可以是类的模板参数
你在哪里实例化bar
?
@Sniper 请不要开始建议使用new
和delete
动态管理该阵列。这就是std::vector
的用途。
【参考方案1】:
原始数组在 C++ 中无法在运行时更改其大小。这就是在 c++ 标准库中创建 std::vector
类的目的。
把你的班级改成
class foo
public:
foo() : arr_size_(8)
foo(size_t arr_size) : arr_size_(arr_size)
~foo();
struct bar
std::vector<int> arrInt; // <<< use std::vector
bar* next;
;
void enqueue(int a);
int dequeue();
private:
size_t arr_size_;
;
现在,当您需要实例化一个新的 bar
对象时,您可以编写
void foo::enqueue(int a)
bar b arrInt(arr_size_), nullptr ;
// or
bar* b = new bar arrInt(arr_size_), nullptr ;
// ...
【讨论】:
我知道数组不能在运行时改变它们的大小。我只是想创建一个可以创建不同长度数组的类,本质上是创建一个“块列表”,为创建的类的每个实例使用不同长度的数组。我只是在试验数据结构,这就是我避免使用向量的原因。 @Chan 没有理由避免使用向量,如前所述,这就是它们的用途。另一种方法是提供大小作为 @M.M. 提到的类模板参数。 @tobi303 好吧,数组或向量出现在内部结构中。 doh,对不起,忽略了这一点,应该多喝咖啡而不是写愚蠢的 cmets ;) @tobi303 多喝咖啡总是一个不错的决定。我的头像清楚地表明了这一点;-)以上是关于如何使数组的大小取决于构造函数参数?的主要内容,如果未能解决你的问题,请参考以下文章
c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?
Symfony 4:如何将$ _SERVER数组作为构造函数参数传递