0

我正在为 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-- 时(我在该行添加了评论)问题将得到解决,但结果将多出一行

可能是什么问题?

谢谢。

4

1 回答 1

0

您将复制构造函数声明为采用非常量引用。复制构造函数通常应该采用 const 引用。可能在调用 operator+ 的地方发生了一些事情,这使得编译器使用默认的 const-ref 复制构造函数(它浅复制指针)。

您的复制构造函数或析构函数也可能没有正确编写。

提示:您是否考虑过使用 std::vector 来保存您的数组?然后你不必担心照顾指针。

于 2013-11-08T11:31:45.383 回答