【问题标题】:Declaring array of objects on heap with variable array size在堆上声明具有可变数组大小的对象数组
【发布时间】:2013-12-01 19:51:34
【问题描述】:

我有一个类,我将根据用户的输入声明数组的大小(二维)。 所以:

class myClass {/*...*/}

int main(){
myClass* arrayObj = new myClass[100][100];

这很好,它应该把数组放在堆上。 但我需要这样做:

int arraySize;
cin >> arraySize;
myClass* arrayObj = new myClass[arraySize][arraySize];

我收到错误: “arraySize”不能出现在常量表达式中。

我假设这意味着我只能在数组的声明中包含常量,但如果没有,那我该怎么做? 数组太大而无法放入堆栈,这就是为什么我首先在​​堆上做它。

编辑:我已经让它与指针一起工作,但我遇到了另一个问题,我有一个使用数组的函数,即。

void myFunction() 
{
    /*...*/
    arrayObj[something][something].variable = somethingElse // error here
}

int main ()
{ 
     /*...*/
    int arraySize;
    cin >> arraySize;
    MyClass **arrayObj = new MyClass*[arraySize]
    for (int i = 0; i < arraySize; i++) arrayObj[i] = new MyClass[arraySize]
    /*...*/
}

我得到:错误:“arrayObj”未在此范围内声明。 我明白为什么,但它在堆上并且它是一个指针,它不应该是全局的吗?如果没有,我将如何使其全球化?

【问题讨论】:

  • 你应该看看std::vector
  • “效果很好......” - 不,它没有。您的编译器非常宽松。您将myClass (*)[100] 分配给myClass * 类型的指针。它们不是同一类型,编译器提高的警告级别可能会告诉您(如果警告配置为失败,则会失败并出现错误,但它应该无论如何都是错误的,我'如果不是,请考虑报废您的工具链)。这也应该告诉你为什么你的第二个 sn-p 也会失败。

标签: c++ pointers multidimensional-array heap-memory


【解决方案1】:

首先你说这个是错误的

class myClass {/*...*/}

int main(){
myClass* arrayObj = new myClass[100][100];

工作正常。编译器将发出错误,因为没有从 myClass ( * )[100] 到 myClass * 的隐式转换

至于你的问题,那么你应该使用以下方法:

myClass **arrayObj = new myClass *[arraySize];

for ( int  = 0; i < arraySize; i++ ) arrayObj[i] = new myClass[arraySize];

【讨论】:

  • 成功了,谢谢。你能解释一下第一行吗?所有的星号是什么意思?
【解决方案2】:

C++ 并没有真正的可变大小多维数组的内置模型。只有最外面的维度可以在运行时变化,所有其他维度都是固定的。背景是 C++ 如何处理算术运算:当向指针添加偏移量时,它会增加一个静态确定大小的对象的大小。

如果您想拥有一个在其他维度上变化的多维数组,您需要使用合适的类或自己实现一个(标准 C++ 库有 std::valarray&lt;T&gt; 来处理多维数组,但是可以说,它们的使用并不完全直截了当)。最简单的方法可能是使用std::vector&lt;std::vector&lt;myClass&gt; &gt;

一种更有效的方法是分配一个大的std::vector&lt;myClass&gt; 作为一个类的成员,并让这个类的operator[]() 返回一个视图到这个数组的相应部分。对于初学者,我可能会使用 std::vector&lt;std::vector&lt;myClass&gt; &gt; 包装到一个类中,如果结果效率太低,则更改实现。

【讨论】:

    【解决方案3】:

    如果您必须使用数组,那么解决此问题的另一种方法是限制数组中的元素数量,并确保在您的代码中强制执行此限制。这是使用数组与 std::vectors 相比的缺点之一。数组是固定大小的,而向量可以保持动态增长。顺便说一句,“数组太大而无法放入堆栈,这就是为什么我首先在​​堆上做它”是什么意思?如果它太大而无法放入堆栈,那么也许我们应该首先看看为什么数组这么大。也许有更好的方法来解决您正在尝试处理的任何问题。

    【讨论】:

    • 这是“人生游戏”,用户输入一个网格大小,如果输入大于 300,程序似乎会崩溃(请记住,它是平方的,所以它是一个相当大的数组)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2012-01-20
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2023-04-01
    • 2021-07-07
    相关资源
    最近更新 更多