该程序的目标是从一维数组类创建复合二维数组类,利用指针和operator[]
在主程序中使用。我们被告知要让 [][]
像标准二维数组一样工作。我可以编译它,但是当我使用 2DArray 类时它崩溃了。我知道目标是理解指针,但我认为运算符 [] 给我带来了最大的麻烦。任何见解将不胜感激。
编辑:使用标准数组进行查找。但是,如果我能够以简单的方式使用该类,我会很高兴,例如:
#include <iostream>
#include "MyArray.h"
#include "TwoDArray.h"
using namespace std;
int main()
{
TwoDArray test(4,5);
cout << "Test output: "<< test[3][2] << endl;
return 0;
}
这里是二维数组类实现的代码:
#include <iostream>
#include <cstdlib>
#include "TwoDArray.h"
#include "MyArray.h"
TwoDArray::TwoDArray()
{
//Default Constructor
row = 10;
col = 10;
MyArray** p = new MyArray* [10];
for (int i = 0; i < 10; i++)
{
p[i] = new MyArray[10];
}
}
TwoDArray::TwoDArray (int r, int c)
{
row = r;
col = c;
MyArray** p = new MyArray* [col];
for (int i = 0; i < col; i++)
{
p[i] = new MyArray[row];
}
}
TwoDArray::~TwoDArray() //Destructor
{
for (int i = 0; i < row; i++)
{
delete [] &p[i];
}
delete [] p;
}
MyArray & TwoDArray::operator[] (int pos)
{
if( pos < 0 || pos >= col )
{
cout << "Illegal index, pos = " << pos << endl;
}
return *p[pos];
}
以及讲师给出的1DArray(MyArray)类实现:
#include <iostream>
#include <cstdlib>
#include "MyArray.h" // "" around header means "look in current directory first"
// default to an array of 10 integers, fill with 0
MyArray::MyArray()
{
int i;
_a = new int[10]; // new allocates RAM from system heap, [] says allocate an array
_n = 10;
for( i = 0; i < 10; i++ )
{
_a[i] = 0; // initialize array to all 0
}
}
// allocate array of a size requested by the client if legal, fill with 0
MyArray::MyArray( int num )
{
int i;
if( num <= 0 ) // if illegal, set to default
{
num = 10;
}
_a = new int[num];
_n = num;
for( i = 0; i < num; i++ )
{
_a[i] = 0; // initialize array to all 0
}
}
// copy constructor - invoke deep copy asignment
MyArray::MyArray( const MyArray &m )
{
*this = m;
}
// destructor - needed to deallocate RAM allocated in constructors
MyArray::~MyArray()
{
delete[] _a;
}
// get value at position pos
int &MyArray::At( int pos )
{
if( pos < 0 || pos >= _n )
{
cout << "Illegal index, pos = " << pos << endl;
exit( -1 );
}
return _a[pos];
}
// get value at position pos using [] indexing operator
int & MyArray::operator []( int pos )
{
cout << "1D [] pos = " << pos << "_n is " << _n << endl;
if( pos < 0 || pos >= _n )
{
cout << "Illegal index, pos = " << pos << endl;
exit( -1 );
}
return _a[pos];
}
// return size, const here means it cannot change self
int MyArray::size( void ) const
{
return _n;
}
// deep copy - REQUIRED if allocated RAM is used by object!
MyArray &MyArray::operator =( const MyArray &rhs )
{
int i;
if( &rhs == this ) // assignment to self?
{
return *this; // if so, don't assign, just return self
}
if( rhs._n != _n ) // rhs not the same size as myself?
{
delete[] _a; // yes, clear out my data and reallocate to match
_a = new int[rhs._n];
_n = rhs._n;
}
for( i = 0; i < rhs._n; i++ ) // copy all elements
{
_a[i] = rhs._a[i];
}
return *this; // allow a = b = c; assignment
}
最佳答案
如果MyArray
本身是一个一维数组,那么我用MyArray
初始化一个二维数组是错误的。我不会描述细节,但我认为你需要做这样的事情 -
TwoDArray::TwoDArray()
{
//Default Constructor
row = 10;
col = 10;
MyArray* p = new MyArray [10];
for (int i = 0; i < 10; i++)
{
p[i] = new MyArray(10);
} }
TwoDArray::TwoDArray (int r, int c)
{
row = r;
col = c;
MyArray* p = new MyArray [col];
for (int i = 0; i < col; i++)
{
p[i] = new MyArray(row);
}
}
请注意,我用一个 1D 数组更改了 2D 初始化,每个数组在内部都是一个 MyArray
对象,它本身就是一个数组 - 因此是 2D 数组
关于具有自定义类的 C++ 动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374620/