有问题的向量返回值 - 没有真正更新?

时间:2010-10-07 22:46:25

标签: c++ vector return

我遇到了这个奇怪的问题:当我的程序达到这个方法时:

//Returns the transpose matrix of this one
RegMatrix RegMatrix::transpose() const{
    RegMatrix result(numCol,numRow);
    int i,j;
    for(i=0;i<numRow;++i)
        for(j=0;j<numCol;++j){
            result._matrix[j][i] = _matrix[i][j];
        }

        return result;
}
它突然崩溃了......

当我使用我的VS调试器运行它时,它看起来一切正常,新矩阵填充了相关值,直到行return result;从某个神秘的原因返回一个空矩阵向量。

我哪里出错?


以下是我对复制构造函数的实现:

//CCtor of RegMatrix                    
RegMatrix::RegMatrix(const RegMatrix &other): numRow(other.getRow()), numCol(other.getCol()){

    //Create
    _matrix = vector<vector<MyDouble> >(other.getRow());
    int i,j;
    for(i=0; i < numRow; i++)
        _matrix[i] = vector<MyDouble>(other.getCol());

    //Copy Matrix
    for(i=0;i<numRow; ++i){
        for(j=0;j<numCol; ++j){
            _matrix[i][j] = other._matrix[i][j];
        }
    }
}

我的赋值运算符实现:

//RegMatrix = RegMatrix 
RegMatrix& RegMatrix::operator=(const RegMatrix rhs){
    assert(numRow == rhs.getRow() && numCol == rhs.getCol());
    if(*this != rhs){
        int i,j;
        for(i=0;i<numRow;++i)
            for(j=0;j<numCol;++j){
                _matrix[i][j] = rhs._matrix[i][j];
            }
    }

    return *this;
}

2 个答案:

答案 0 :(得分:0)

您将按值返回矩阵。复制构造函数涉及到。你的拷贝构造函数是如何定义的?

答案 1 :(得分:0)

假设MyDouble有一个正确的拷贝构造函数,你应该能够将你的拷贝构造函数减少到这个:

RegMatrix::RegMatrix(const RegMatrix &other):numRow(other.getRow()), numCol(other.getCol()),
    _matrix(other._matrix)
{ }

看看会给你带来什么。

编辑: 如果列和行不相等,则赋值运算符可能会出现问题。你在那个实例中抛出了一个断言,所以程序就要中止了。那是你要的吗?您是否宁愿更改分配和行以匹配新值?如果是这样,你可以这样做:

RegMatrix & RegMatrix::operator=(const RegMatrix & rhs) {
    if(this == &rhs)
        return *this;
    numRow = rhs.getRow();
    numCol = rhs.getCol();
    _matrix = rhs._matrix;
    return *this;
}