我正在为 C++ 上的稀疏矩阵开发 ADT(使用 Visual C++ 2012)
这是我的类定义:
类 Class 包括一个单元格数组(每个单元格包括一个行号、一个列号和一个非零值)
编辑:我认为问题出在复制构造函数上,所以我在这里添加了构造函数:
class Sparce
{
friend std::ostream & operator <<(std::ostream& os, Sparce &sprc);
Cell * cells;
int row;
int col;
int value;
public:
Sparce(int ** a , int r, int c);
Sparce( const Sparce & a )
{
cells = new Cell[a.value];
setRow(a.row);
setCol(a.col);
setValue(a.value);
for (int i = 0; i < value; i++)
{
cells[i].setCell(a.cells[i].getRow(),a.cells[i].getCol(),a.cells[i].getValue());
}
}
Sparce (int r , int c , int val);
~Sparce(void);
int getRow();
int getCol();
int getValue();
void setRow(int r);
void setCol(int c);
void setValue(int v);
int getRowX(int i);
int getRowY(int i);
int getRowValue(int i);
Sparce operator+ (Sparce sp2);
};
单元格定义为:
class Cell
{
public:
Cell(int r , int c , int v);
Cell();
int getRow();
int getCol();
int getValue();
void setCell(int r , int c , int v);
void setRow(int r);
void setCol(int c);
void setValue(int v);
private:
int row;
int col;
int value;
};
似乎我的 + 运算符不起作用,并且在运算符的返回行上出现运行时错误:
Sparce Sparce::operator+ (Sparce sp2)
{
if(getRow() != sp2.getRow() || getCol() != sp2.getCol())
throw std::exception("For adding to array most have same rows and coloumns");
int k1 = 0 , k2 = 0 , k3 = 0;
//counting number of none zero value for result
while (k1 < getRow() && k2<sp2.getRow())
{
if(getRowX(k1) < sp2.getRowX(k2))
{
k1++;
k3++;
}
else if(getRowX(k1) > sp2.getRowX(k2))
{
k2++;
k3++;
}
else if(getRowX(k1) == sp2.getRowX(k2))
{
if (getRowY(k1) < sp2.getRowY(k2))
{
k1++;
k3++;
}
else if(getRowY(k1) > sp2.getRowY(k2))
{
k2++;
k3++;
}
else if(getRowX(k1) == sp2.getRowX(k2))
{
k1++;
k2++;
k3++;
}
}
}//while
while(k1<getValue())
{
k1++;
k3++;
}
while(k2<sp2.getValue())
{
k2++;
k3++;
}
//end counting
k3--;//we will count one extra ++ , so We should reduce it.when i comment this line there will be no run time error and correct answer but an extra line in result
Sparce res(getRow(),getCol(),k3);
k1 = 0;
k2 = 0;
k3 = 0;
while (k1 < getRow() && k2<sp2.getRow())
{
if(getRowX(k1) < sp2.getRowX(k2))
{
res.cells[k3].setCell(getRowX(k1),getRowY(k1),getRowValue(k1));
k1++;
k3++;
}
else if(getRowX(k1) > sp2.getRowX(k2))
{
res.cells[k3].setCell(sp2.getRowX(k2),sp2.getRowY(k2),sp2.getRowValue(k2));
k2++;
k3++;
}
else if(getRowX(k1) == sp2.getRowX(k2))
{
if (getRowY(k1) < sp2.getRowY(k2))
{
res.cells[k3].setCell(getRowX(k1),getRowY(k1),getRowValue(k1));
k1++;
k3++;
}
else if(getRowY(k1) > sp2.getRowY(k2))
{
res.cells[k3].setCell(sp2.getRowX(k2),sp2.getRowY(k2),sp2.getRowValue(k2));
k2++;
k3++;
}
else if(getRowX(k1) == sp2.getRowX(k2))
{
res.cells[k3].setCell(sp2.getRowX(k2),sp2.getRowY(k2),getRowValue(k1)+sp2.getRowValue(k2));
k1++;
k2++;
k3++;
}
}
}//while
while(k1<getValue())
{
res.cells[k3].setCell(getRowX(k1),getRowY(k1),getRowValue(k1));
k1++;
k3++;
}
while(k2<sp2.getValue())
{
res.cells[k3].setCell(sp2.getRowX(k2),sp2.getRowY(k2),sp2.getRowValue(k2));
k2++;
k3++;
}
return res;
}
编辑:当我在我的代码中评论最后一个 k3-- 时(我在该行添加了评论)问题将得到解决,但结果将多出一行
可能是什么问题?
谢谢。