私有属性 C++ 上的动态二维数组
Posted
技术标签:
【中文标题】私有属性 C++ 上的动态二维数组【英文标题】:dynamic 2-D array on private attribute C++ 【发布时间】:2016-05-31 04:30:12 【问题描述】:我想在一维中将二维数组的大小加倍。我在私有成员中定义了一个二维数组
private:
static const int ARRAY_SIZE=2;
static const int NUM_ARRAYS=26;
Profile membersArray[NUM_ARRAYS][ARRAY_SIZE];
只要该行中有足够的元素,我就想将 ARRAY_SIZE 加倍。 在我的私有方法中
void MyADT::copyAndDoubleArray()
membersArray= new (nothrow) Profile[NUM_ARRAYS][2*ARRAY_SIZE];
出现以下错误
error: Array type 'Profile[26][2] is not assignable
我认为它与作为私有属性的数组有关。所以我想我需要知道如何初始化允许动态分配的数组
【问题讨论】:
您无法调整 C++ 数组的大小。它们的大小在编译时是固定的。使用std::vector
或类似的容器类型。
感谢您的澄清。这很奇怪,因为这是一个作业,教授特别声明我们只允许使用数组。我认为这是一个展示链表需求的练习。
【参考方案1】:
不,它与声明为 private
的成员无关,因为从您的代码中可以看出,您正试图在成员函数内部访问 membersArray
。
首先在你的类中保留一个指向Profile
的指针并在一维中分配内存。
Profile *membersArray;
membersArray = new Profile[NUM_ARRAYS*ARRAY_SIZE];
现在您可以将membersArray
的元素作为membersArray(x*ARRAY_SIZE+y)
访问,其中x and y
是二维数组的维度,其中[0 <= x < NUM_ARRAYS] and [0 <= y < ARRAY_SIZE]
现在如果你想增加现有数组的大小,那么:
Profile *temp = new Profile[NUM_ARRAYS*(2*ARRAY_SIZE)];
//You can code here to copy existing elements from membersArray to temp.
//Elements of temp can be accessed as temp(x*(2*ARRAY_SIZE)+y)` where x and y are dimension of the 2D array and [0 <= x < NUM_ARRAYS] and [0 <= y < (2*ARRAY_SIZE)]
//Now delete membersArray.
delete [] membersArray;
//Now assign new increased sized array to membersArray.
membersArray = temp;
【讨论】:
【参考方案2】:数组类型的对象不能作为一个整体进行修改:即使它们 是“左值”(例如,可以采用数组的地址),它们不能 出现在赋值运算符的左侧。[*]
因此,您需要使用new[]-expression
声明您的数组。你可能会得到类似的结果:
private: Profile **ppMembersArray;
public: constructor()
resize(DEFAULT_ROWS_COUNT, DEFAULT_COLUMNS_COUNT);
void resize(int newRowsCount, int newColumnsCount)
// allocate some enough memory..
Profile **ppNewMembersArray = new Profile*[newRowsCount];
for (int i = 0; i < newRowsCount; i++)
ppNewMembersArray[i] = new int[newColumnsCount];
// copy the existing data to the new address, release the previous ones, and so on..
【讨论】:
以上是关于私有属性 C++ 上的动态二维数组的主要内容,如果未能解决你的问题,请参考以下文章