私有属性 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++ 上的动态二维数组的主要内容,如果未能解决你的问题,请参考以下文章

指针对指针的动态二维数组

C ++通过访问器函数返回私有二维数组

利用c++中的vector创建动态二维数组

c++ 动态分配二维数组 new 二维数组

二维数组C++的动态分配

C++ new申请二维数组整理