2016-05-31 8 views
-2

Ich habe ein Objekt Matrix und ich überladen den unären Minus-Operator und ich kann nicht mein Programm arbeiten zu machen. Wenn ich den Rückgabetyp als Referenz einfüge, kann ich das Objekt, das ich in der Funktion erstellt habe, nicht zurückgeben, wenn ich den Rückgabetyp als Matrix einfüge, bekomme ich einen Segmentierungsfehler.Unäre minus Operator Überlast C++ Segmentierung Fehler

in der H-Datei:

Matrix operator -() const; 

in der CPP-Datei:

Matrix Matrix::operator -() const 
{ 
    if (isValid==false)//just a validity check 
    return *this; 

    Matrix mat(*this);//copy ctor 

    for (int i=0;i<row;i++) 
     for (int j=0;j<col;j++) 
      mat.matrix[i][j]=-matrix[i][j]; 

    return mat; 
} 

Ich habe versucht, viele Permutationen, dass (Hinzufügen const, durch Verweis hinzufügen) und nichts scheint zu funktionieren. Wie behebe ich das?

+0

Die Implementierung und Verwendung – imreal

+0

Jede Verwendung des Minus-Operator helfen würde, löst die Segmentierungsfehler, und es gelangt nicht einmal die Funktion (versucht, etwas zu cout). Ich werde es unabhängig schreiben –

+0

Sie müssen den echten Code setzen, diese Methode hat nicht einmal Parameter und wenn sie nicht die Funktion eingeben, setzen Sie die Call-Site. – imreal

Antwort

1

Das Folgende funktioniert ohne Segmentierungsfehler. Sie sollten Ihren Code minimieren, indem Sie alles Unnötige entfernen, und ihn dann schrittweise in den unten stehenden Code umwandeln und sehen, in welchem ​​Stadium Ihr Segmentierungsfehler verschwindet.

#include <iostream> 
#include <vector> 

using namespace std; 

class Matrix { 
public: 
    Matrix() : isValid(true), row(0), col(0) {} 
    Matrix(int r, int c, int val); 
    Matrix(const Matrix&); 
    Matrix operator -() const; 
private: 
    bool isValid; 
    int row, col; 
    vector<vector<int> > matrix; 
}; 

Matrix::Matrix(int r, int c, int val) : isValid(true), row(r), col(c) { 
    matrix.resize(r); 
    for (int i=0; i<r; i++) 
     matrix[i].resize(c, val); 
} 

Matrix::Matrix(const Matrix& m) : isValid(true), row(m.row), col(m.col), matrix(m.matrix) {} 

Matrix Matrix::operator -() const 
{ 
    if (isValid==false)//just a validity check 
    return *this; 

    Matrix mat(*this);//copy ctor 

    for (int i=0;i<row;i++) 
     for (int j=0;j<col;j++) 
      mat.matrix[i][j]=-matrix[i][j]; 

    return mat; 
} 

main() { 
    int r=10, c=5; 
    Matrix m(r, c, 1); 
    Matrix m1; 
    m1 = -m; 
} 
Verwandte Themen