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