2010-10-07 17 views
0

Je vais avoir ce problème bizarre: quand mon programme atteint cette méthode:Valeur de retour de vecteur problématique - pas vraiment mise à jour?

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

il bloque tout à coup ...

Quand je l'ai couru avec mon débogueur VS, il semblait que tout va bien, la nouvelle matrice a été rempli avec les valeurs pertinentes, jusqu'à la ligne return result; qui, pour une raison mystérieuse a retourné un vecteur de matrice vide.

Où est-ce que je vais mal ??


Voici mon implémentation pour le constructeur de copie:

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

Mon opérateur d'affectation mise en œuvre:

//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; 
} 
+0

À quoi ressemble votre constructeur de copie? –

+0

Votre constructeur de copie fait beaucoup et beaucoup de copie inutile (voir la réponse de PigBen), mais à la fin cela devrait fonctionner. Je peux imaginer le code va comme 'RegMatrix transposée = someMatrix.transpose();' si le suspect est à côté de votre opérateur d'affectation –

Répondre

0

En supposant que MyDouble a un constructeur de copie correcte, vous devriez être en mesure de réduire votre constructeur de copie à ceci:

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

Voyez ce qui vous fait.

Éditer: Votre opérateur d'affectation peut poser un problème si les colonnes et les lignes ne sont pas égales. Vous lancez une affirmation dans ce cas, donc le programme va avorter. Est-ce que c'est ce que tu veux? Ne préféreriez-vous pas que l'affectation modifie les colonnes et les lignes pour qu'elles correspondent aux nouvelles valeurs? Si oui, vous pouvez simplement faire ceci:

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

il me cause certains problèmes encore plus mystérieux .. ce qui ne va pas avec mon CCtor actuel? – limlim

+0

Probablement rien, il contient juste du code inutile, donc il est plus enclin à avoir des erreurs. Je pense que si vous simplifiez votre constructeur, vous pouvez être sûr que ce n'est pas le problème. Voir le commentaire d'Alex, nous devons maintenant voir votre opérateur d'affectation. Si vous n'en avez pas, nous aurons besoin de voir votre corps de classe. –

+0

Quel genre de «problème plus mystérieux» est-ce que ce cc provoque? –

0

Vous retournez la matrice par valeur. Un constructeur de copie s'implique. Comment votre constructeur de copie est-il défini?

+0

// CCtor de RegMatrix \t \t \t \t RegMatrix :: RegMatrix (const RegMatrix et autres): numRow (autre .getRow()), numCol (autre.getCol()) { \t // Créer \t _matrix = vector > (other.getRow()); \t int i, j; \t pour (i = 0; i (autre.getCol()); \t // Copy matrice \t for (i = 0; i limlim

+0

Mettez cela dans votre question, correctement formaté s'il vous plaît. –

+0

(je l'ai ajouté à ma question afin que ce serait plus agréable) – limlim