【问题标题】:Making a 2d array with constructor and user input使用构造函数和用户输入制作二维数组
【发布时间】:2016-06-26 13:13:52
【问题描述】:

我被困住了。我希望能够接受用户输入,并使用构造函数创建一个公共二维数组,我的代码如下: `

class myarray
{
    char** grid;
    int dimX,dimY;
public:
    myarray(){grid=0;}
    myarray(int m,int n) {grid = new char* [m]; for(int i=0;i<m;i++) {grid[i]=new char [n];} dimX=m; dimY=n;}
    ~myarray(){for(int i = 0; i < dimX; ++i) {delete[] grid[i];} delete[] grid;}
    char** fetcharray(){return grid;}

int main()
{
    srand(time(NULL));
    bool check(true),arrayinitialized(false);
    while(check)
    {
        char a; //a-firstinp;
        int m,n; //m,n-grid size

        cin>>a;

        myarray c;

        switch(a)
        {
        case 'i':
        case 'I': {cin>>m>>n;
                  c(m,n);
                  arrayinitialized=true;
                  break;}
        case ...:...
        default:{cout<<"Invalid input! Try again: "; break;}

`

正如我所说,我在“c(m,n);”行出现错误,错误提示“错误:不匹配调用‘(myarray) (int&, int&)’”

如果我在其中一种情况下在本地声明 c,程序就可以正常工作,但是我希望它可以在整个 main() 中访问

提前谢谢你!

【问题讨论】:

  • 我会使用一维数组[m*n] 并提供一个'运算符 () (row, col)' 来映射到二维。

标签: c++ arrays class matrix constructor


【解决方案1】:

您的代码存在一些问题。让我们一一来看看:

myarray(){grid=NULL;}=default

你不能实现这个构造函数然后告诉 C++ 你想要默认的构造函数。你必须做出决定。另外,C++ 有nullptr:

myarray(){ grid = nullptr; }

myarray(int& m,int& n) {
    grid = new char* [m];
    for(int i=0;i<n;i++) {
        grid[m]=new char [n];
    }
}

您正在循环错误的变量!您应该循环m 次,因为您有空间供m char*s 使用。另外,您想将new char [n] 分配给grid[i],而不是grid[m]

myarray(int& m,int& n) {
    grid = new char* [m];
    for(int i=0;i<m;i++) {
        grid[i]=new char [n];
    }
}

~myarray(){delete [] grid;}

您只删除了char**,但绝不会删除您创建的char*。您必须将尺寸存储在某处并再次遍历数组,将它们一一删除:

~myarray(){
    for(int i = 0; i < dimX; ++i) {
        delete[] grid[i];
    }
    delete[] grid;
}

在构造时将dimX保存在实例变量中(m


你会得到这样的结果:

class myarray
{
    char** grid;
    int dimX;
public:
    myarray(){ grid = nullptr; dimX = 0; }

    myarray(int& m,int& n) {
        grid = new char* [m];
        for(int i=0;i<m;i++) {
            grid[i]=new char [n];
        }
        dimX = m;
    }

    ~myarray(){
        for(int i = 0; i < dimX; ++i) {
            delete[] grid[i];
        }
        delete[] grid;
    }

    char** fetcharray(){ return grid; }
};

【讨论】:

  • 谢谢,我完全搞明白了!
【解决方案2】:

您的问题仍然没有答案..您能否提供完整的代码(包括...和完整的错误) 也许您尝试在某个地方访问 c(m,n)?

tkausl 更快,所以一些更完整的例子。

class myarray
{
    char** grid;
    int dimX;
    int dimY;
public:
    myarray(){ grid = nullptr; dimX = 0; dimY=0; }

    myarray(int m,int n) { // don't use reference for this parameters, for complex types use pattern "const TYPE& name"
        dimX=m; dimY=n;
        grid = new char* [m];
        for(int i=0;i<m;i++) {
            grid[i]=new char [n];
        }
    }

    ~myarray(){
        for(int i = 0; i < dimX; ++i) {
            delete[] grid[i];
        }
        delete[] grid;
    }

    char** fetcharray(){ return grid; } // not really needed, avoid external access of internal data

    char at(int m, int n) const { 
        if(m<0 || m>=dimX || n<0 || n>=dimY) return 0; // check index bounds
        return grid[m][n]; 
    }
    char operator()(int m, int n) const { return at(m,n); } // overloading of () operator allows nice use

    char& at(int m, int n)  { 
        if(m<0 || m>=dimX || n<0 || n>=dimY)
        {
            // this is not nice, but ensures that always a writable memory is retured, 
            // may cause unecpected behavour, add breakpoint, trace, assert here
            // in production this shall never get exceuted
            static char dummy; 
            dummy=0;
            return dummy; 
        }
        return grid[m][n]; 
    }

    char& operator()(int m, int n)  { return at(m,n); }
    int sizeX()const { return dimX; }
    int sizeY()const { return dimY; }

};

用法如下:

  myarray c(3,5);
  int x=c(2,1);
  c(2,1)=x+2;
  int y=c.at(2,1); // the const at variant
  c.at(2,1)=x+2;  // this is the non-const variant

【讨论】:

  • 我刚刚编辑了主要问题,并更新了代码。现在你可以看看它
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-11-25
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多