如何使数组的大小取决于构造函数参数?

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 请不要开始建议使用newdelete 动态管理该阵列。这就是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++ 中使用参数在构造函数中定义自己的类的数组

将数组传递给构造函数会产生大小为 1 的数组? [复制]

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

Symfony 4:如何将$ _SERVER数组作为构造函数参数传递

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

如何将构造函数与数组一起使用?