在不同的C ++类中构造一个class属性数组

时间:2017-09-28 12:12:47

标签: c++ arrays class

我必须做一个项目,其中一个类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循环中取出第一个数组,而不是intColintLength正在增加,因为我在技术上需要一个在每个数组中都有不同大小的锯齿状数组。

我的课程如下:

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

感谢任何帮助或建议。

1 个答案:

答案 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)进行循环复制才能正常工作。