使用C ++中的array.h参数在函数中传递2D动态数组

时间:2017-11-29 07:59:31

标签: c++ dynamic-arrays

我已将代码分成3个文件:main.cpp,array.h,array.cpp

我的代码要求用户输入方形2D矩阵的大小,并实现一些功能(转置,添加2个2D数组等)

我的array.cpp构造函数初始化一个大小为s的动态数组,并将所有条目都放到0。

Array::Array(int s)
{
    // The constructor creates a dynamic array v[s][s], and set size to s.
    // initialize all entries v[i][j] to 0.
    int **v = new int*[s];
    for(int i = 0; i < s; ++i)
        v[i] = new int[s];

    for(int i = 0; i < s; i++)
        for(int j = 0; j < s; j++)
            v[i][j] = 0;
}

Array::~Array()
{
    // The destructor deletes v.
    int arraysize = sizeof(v)/sizeof(v[0]);
    for(int i = 0; i < arraysize; ++i)
    {
        delete [] v[i];
    }
    delete [] v;

}

这是我的main.cpp的一部分,我遇到了麻烦。 我有一个函数要求用户在我的主函数的顶部输入二维数组的条目,但我一直在收到错误&#34;键入&#39;数组&#39;不提供下标运算符&#34;

    #include <iostream>
    #include "array.h"

    using namespace std;

    // input array

    void input(Array &C)
    {
        int i, j;
        for(i = 0; C[i][0] == 0; i++)
            for(j = 0; C[0][j] == 0; j++)
            {
                cin >> C[i][j];
            }
    }

    int main(void)
    {
        //input size
        int size;
        cout << "Please input array size:" << endl;
        cin >> size;

        //input A, B
        Array A(size), B(size);
        cout << "Please input " << size << "x" << size << "integer array A:" << endl;
        input(A);
        cout << "Please input " << size << "x" << size << "integer array B:" << endl;
        input(B);

........

我必须使用参数(Array&amp; C)作为输入函数,但我不确定如何更改输入函数的主体

1 个答案:

答案 0 :(得分:1)

首先,表达式sizeof(v)/sizeof(v[0])没有达到预期的效果。

这适用于静态分配的数组,而不适用于动态分配的数组。

sizeof表达式在编译时被翻译,通过将其应用于操作数的类型。

在您的情况下,操作数为v,其类型为int**

因此,sizeof(v)相当于sizeof(int**),而sizeof(v[0])相当于sizeof(int*)

您期望表达式sizeof(v)为您提供v指向的动态分配数组的大小,但编译器无法猜测(在编译时)在此期间此大小将是什么运行时。

关于手头的实际问题(正如在评论中已经提到的那样),您需要在Array类中实现以下功能:

  1. 读者 - int* Array::operator[](int index) const {return v[index];}
  2. 作家 - int*& Array::operator[](int index) {return v[index];}
  3. 顺便说一句,在构造函数中声明一个名为v的局部变量,将导致该局部变量的初始化,而不是在同名的成员变量的初始化中。