2017-06-03 251 views
3

我有一个类,其中它是受保护的部分我需要声明一个未知大小的数组(大小作为参数给予构造函数),所以我环顾四周,发现出,最好的可能的解决方案是声明指针数组,每个元件指向整数:指针数组和指针指向一个数组在C++

int* some_array_; 

和简单地在构造我将使用“新”的操作符:

some_array_ = new int[size]; 

它的工作原理,我的问题是:我可以在没有定义si的情况下在类中声明一个数组泽?如果是的话,我该怎么做,如果没有,那么为什么它的指针而不是一个正常的数组?

编辑:我知道vecotrs会解决这个问题,但我不能在我的HW

+0

你可能不想保护数据 - 它几乎总是一个坏主意。并使用std :: vector,而不是一个显式动态分配的数组。 –

+1

有两种定义数组的方法... 1.在编译int Name [10]时定义的大小,然后在堆栈中...您不需要delete命令,因为它会自动删除当你走出这个空间时。 2.一个动态数组int * Name = new int [n],然后它在堆上。所以它会一直持续到你说delete []名称 – Thomas

+1

'some_array_'不是一个指针数组,它是一个指向数组第一个元素的指针。一个指针数组是'int * x [size]';一个指向数组'int(* x)[size]'的指针。 – molbdnilo

回答

0

你总是可以使用矢量使用它们。在你的代码的顶部#include <vector>,然后定义矢量如下:要做到这一点,添加此行的代码

vector<int> vectorName;

请记住,向量阵列和不应该被视为因此。例如,在一个循环中,您想要检索像这样的矢量的元素:vectorName.at(index)而不是这样:vectorName[index]

+0

你们知道,向量很容易解决这个问题,问题是我不能使用他们对我的任务:( –

1

您必须从编译器的角度思考它是如何工作的。一个指针使用特定数量的空间(通常是4个字节),并且您使用新的操作符请求更多空间。但是空数组使用多少空间?它不能是0字节,编译器无法知道在没有任何元素的情况下为数组分配什么空间,因此它是不允许的。

0

假设你有一个大小为2的整数数组。所以你有Array [0,1] 数组是连续的memery字节,所以如果你声明了一个然后你想添加一个或多个元素结束在这个数组中,确切的下一个位置(在这种情况下:在索引2(或第三个整数))很有可能已经被分配,所以在这种情况下,你不能这样做。一个解决方案是创建一个新的数组(在这种情况下有3个元素),将初始数组复制到新的数组中,并在最后一个位置添加新的整数。显然这有很高的成本,所以我们不这样做。

在C++中解决此问题的方法是Vector,Java中是ArrayLists。