在堆上声明具有可变数组大小的对象数组

时间:2013-12-01 19:51:34

标签: c++ pointers multidimensional-array heap

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

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'未在此范围内声明。 我可以看到原因,但是它在堆上并且它是一个指针,它不应该是全局的吗?如果没有,我将如何使其全球化?

3 个答案:

答案 0 :(得分:2)

首先,你错误地说这个

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];

答案 1 :(得分:2)

C ++实际上没有可变大小的多维数组的内置模型。只有最外层的尺寸可以在运行时变化,所有其他尺寸都是固定的。背景是C ++如何处理算术:当向指针添加偏移时,它会以具有静态确定大小的对象的大小前进。

如果你想让一个多维数组在其他方面有所不同,你需要使用一个合适的类或自己实现一个(标准C ++库有std::valarray<T>来处理多维但是,它们的使用并不完全是直接的。最简单的方法可能是使用std::vector<std::vector<myClass> >

更有效的方法是将大std::vector<myClass>分配为类的成员,并使此类的operator[]()将视图返回到此数组的相应部分。对于初学者,我可能只是使用包含在类中的std::vector<std::vector<myClass> >,如果结果太低效,则更改实现。

答案 2 :(得分:0)

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