繁体   English   中英

使用构造函数和用户输入制作二维数组

[英]Making a 2d array with constructor and user input

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

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()中访问它

先感谢您!

您的代码有些错误。 让我们一一介绍它们:

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保存在构造dimXm )中


您将得到如下所示的结果:

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; }
};

您的问题仍然没有答案..您能否提供完整的代码(包括...和完整的错误),也许您尝试在某处访问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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM