我必须做一个项目,其中一个类Row
有一个整数数组int* OneArray
,然后另一个类Array
有一个第一个类Row* TwoDArray
的数组。本质上,类在整数上有一个2D数组,当它在一个类中时,我可以轻松地构建2D数组。但是,现在我完全被难倒了。
Row
的构造很简单:
//set length of array
numOfRows = intRows;
//Create space for array
OneArray = new int[intRows];
//populate array with random numbers
for(int i=0; i<intRows; i++)
{
OneArray[i] = GenerateRandom(9,0);
}
这就是我陷入困境的地方(构建Array
):
//Set Number of Cols
NumOfCol = intCols;
//create length for each row
int intLength = 4;
for(int i=0; i<NumOfCol; i++)
{
//create space and call row constructor with length
TwoDArray = new Row(intLength);
//increase length for jagged array
intLength++;
}
现在它在每个for循环之后写入当前数组(这是预期的)。所以,我需要像TwoDArray
一样索引TwoDArray[i]
,但是一旦我尝试这样做,我就会收到此错误:
“从'Row *'到'const Row&amp;'的用户定义转换无效。”
注意:如果我从for循环中取出第一个数组,而不是intCol
。 intLength
正在增加,因为我在技术上需要一个在每个数组中都有不同大小的锯齿状数组。
我的课程如下:
class Row
{
public:
//Constructors
Row();
Row(int intRows);
Row(const Row& objPrev);
//Accessors
int getNumOfRows();
int getRowArray(int intRow);
//Mutators
void setRowArray(int intRow, int intChange);
//Destructor
~Row();
private:
int* OneArray;
int numOfRows;
}
和
class Array
{
public:
//Constructors
Array();
Array(int intRows, int intCols);
Array(const Array& objPrev);
//Accessors
int getNumOfCol();
Row getTwoDArray(int intCol, int intRow);
//Mutators
void setTwoDArray(int intCol, int intRow, int intChageTo);
//Destructor
~Array();
private:
Row* TwoDArray;
int NumOfCol;
}
感谢任何帮助或建议。
答案 0 :(得分:1)
在Array
循环中,您多次分配一个Row
对象,覆盖每个循环中的指针。这导致内存泄漏,因为只有最后一个将通过变量TwoDArray
可用。此外,在循环结束时,您将拥有的只是一个元素的“数组”,即最后分配的Row
对象。
问题是您在调用特定构造函数的同时无法使用new[]
进行数组分配。你可以不做例如。
TwoDArray = new Row[NumOfCol](intLength);
相反,您必须将分配和初始化分为两部分:
TwoDArray = new Row[NumOfCol]; // Allocates memory, default constructed Row objects
for (int i = 0; i < NumOfCol; ++i)
{
TwoDArray[i] = Row(intLength); // Initialize each element
}
当然,这需要您按照rules of three or five (or zero)进行循环复制才能正常工作。