Возвращаемое значение проблемного вектора - не обновлено? - PullRequest
0 голосов
/ 08 октября 2010

У меня странная проблема: когда моя программа достигает этого метода:

//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 голосов
/ 08 октября 2010

Предполагая, что MyDouble имеет правильный конструктор копирования, вы должны быть в состоянии уменьшить свой конструктор копирования до следующего:

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

Посмотрите, что это вам дает.

Редактировать: Ваше назначениеоператор может быть проблемой, если столбцы и строки не равны.В этом случае вы запускаете assert, поэтому программа будет прервана.Это то, что вы хотите?Вы бы предпочли, чтобы назначение изменило столбцы и строки, чтобы соответствовать новым значениям?Если это так, вы можете просто сделать это:

RegMatrix & RegMatrix::operator=(const RegMatrix & rhs) {
    if(this == &rhs)
        return *this;
    numRow = rhs.getRow();
    numCol = rhs.getCol();
    _matrix = rhs._matrix;
    return *this;
}
0 голосов
/ 08 октября 2010

Вы возвращаете матрицу по значению.Конструктор копирования становится вовлеченным.Как определяется ваш конструктор копирования?

...