【问题标题】:set array size on c++ after initialization [duplicate]初始化后在c ++上设置数组大小[重复]
【发布时间】: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] 或行为与指针基本相同的迭代器。

标签: c++ arrays


【解决方案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 对象被分配的地方,这可以是堆栈、堆、静态数据区或其他任何地方
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2011-12-24
    • 2010-10-19
    • 2021-06-08
    • 2023-02-23
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多