初始化后在c ++上设置数组大小[重复]

Posted

技术标签:

【中文标题】初始化后在c ++上设置数组大小[重复]【英文标题】:set array size on c++ after initialization [duplicate] 【发布时间】:2016-03-12 11:31:04 【问题描述】:
class foo

private:
    int map[SCENE_WIDTH * SCENE_HEIGHT];


问题是我还不知道场景宽度,我想做类似的事情:

int map[];

void setSize(int s)
 map[5];

我知道这样做的唯一方法是执行 int *map 然后 map = new int[3] 但我将使用动态内存,我必须稍后将其删除。如何像“第一种方法”那样做?

【问题讨论】:

改用std::vector<int>resize() 简短的版本是,你不能。数组的大小必须是编译时常量。 (Gcc 和 clang 对运行时大小的数组进行了扩展,但我认为这不适用于类成员)。这里正常的做法是使用标准库组件std::vector 那么如果我必须通过向量会更糟,因为我需要一个迭代器 @DanielRocaLopez 我不明白您对需要迭代器的抱怨? vector 访问与数组访问非常相似,您使用 v[index] 或行为与指针基本相同的迭代器。 【参考方案1】:

无法像在标准 C++ 中那样调整数组大小。

改为使用std::vector。例如;

#include <vector>

class foo

    public:

        foo(std::size_t size = 0) : map(size) ;     //  initialises number of elements in map

        void resize(std::size_t size)
        
             map.resize(size);
        ;

    private:
       std::vector<int> map;
;

foo 类型的对象被销毁时,包含的vector&lt;int&gt; 将被隐式销毁,并释放它已分配的所有资源。

std::vector 以外的容器可以满足特定需求,但实际上std::vector 是一个很好的默认选择。

【讨论】:

【参考方案2】:

int map[SIZE]; 分配在堆栈上,这个数组的大小必须在编译时知道并且必须在这个变量的声明中提及,因为否则语法map[5]; 将被视为提取此数组的第六个值。

总而言之,你不能那样做,但是你可以使用std::vector来达到这个目的。

【讨论】:

int map[SIZE] 将被分配到任何foo 对象被分配的地方,这可以是堆栈、堆、静态数据区或其他任何地方

以上是关于初始化后在c ++上设置数组大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用VS 2012在构造函数中初始化树节点中的数组

Perl 中的数组初始化

剖析C动态内存管理 (malloc,calloc,realloc,柔性数组)

c语言 图形方式初始化

C语言一维数组二维数组结构体的初始化

如何在不知道数组大小的情况下初始化数组?