C++表达式必须具有常量值

4

我有这个方法:

void createSomething(Items &items)
{
    int arr[items.count]; // number of items
}

但是它抛出了一个错误:
expression must have a constant value

我找到了这个解决方案:
int** arr= new int*[items.count];

我想知道是否有更好的方法来处理这个问题?


7
你的“解决方案”与你在第一个示例中意图实现的完全不同。无论如何,请查阅std::vector - juanchopanza
如果你还不清楚的话,使用方括号表示法无法在运行时确定数组的大小。虽然有其他处理方式(参见malloc()),但正如@juanchopanza所指出的那样,std::vector是正确的选择。 - Bob
1
我认为你需要看到,你的“解决方案”的正确版本应该是int* arr = new int[items.count];而不是使用指针数组。但当然,std::vector更好。 - Ryan Haining
你想要做什么? - Lightness Races in Orbit
我只是想创建数组,不过没关系,已经得到了答案。 - dontHaveName
2个回答

8
您可以使用 std::vector
void createSomething(Items &items)
{
    std::vector<int> arr(items.count); // number of items
}

你的第一种方法行不通的原因是数组的大小必须在编译时知道(除非使用编译器扩展),所以你必须使用动态大小的数组。你可以使用 new 来分配数组。
void createSomething(Items &items)
{
    int* arr = new int[items.count]; // number of items

    // also remember to clean up your memory
    delete[] arr;
}

但是使用 std::vector 更安全,我认为更有帮助。


1
如果我使用std::vector,我就不需要清理内存了吗? - dontHaveName
1
不需要,std::vector 的析构函数会自动清理内存,这也是为什么使用它比手动管理内存更好的原因之一。 - Cory Kramer

2

Built in arraysstd::array总是需要一个常量整数来确定它们的大小。当然,在动态数组的情况下(使用new关键字创建的数组),可以使用非常量整数,就像您展示的那样。

然而,当涉及到数组类型应用时,std::vector(当然内部是动态数组)是最好的解决方案。这不仅因为它可以被赋予非常量整数作为大小,而且它可以有效地动态增长。此外,std::vector还有许多花哨的函数可以帮助您完成工作。

在您的问题中,您只需将int arr[items.count];替换为:

std::vector<int> arr(items.count);   // You need to mention the type
// because std::vector is a class template, hence here 'int' is mentioned

一旦您开始使用 std::vector,您会发现在99%的情况下它比普通数组更加灵活,因此您更喜欢使用它。首先,您不需要担心删除它。向量会处理它。此外,像push_backinsertemplace_backemplaceerase等函数帮助您对其进行有效的插入和删除,这意味着您不必手动编写这些函数。

有关更多参考,请参阅this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接