2016-04-28 10 views
0

Ich habe ein Problem mit static_cast. Hier ist mein Programm:C++ gibt mir einen Fehler: keine Übereinstimmung für den Aufruf an

#include <iostream> 
using namespace std; 

class Mtx { // base matrix 
private: 
    // refer to derived class 
    Mtx& ReferToDerived() { 
     return static_cast<Mtx&>(*this); 
    } 
    // entry() uses features of derived class 
    virtual double& entry(int i, int j){ 
    return ReferToDerived() (i,j); // error appears here 
    } 
protected: 
    int dimn; // dimension of matrix 
public: 
    // define common functionality in base class that can 
    // be called on derived classes 
    double sum() { // sum all entries 
     double d = 0; 
     for (int i = 0; i < dimn; i++) 
      for (int j = 0; j < dimn; j++) d += entry(i,j); 
     return d; 
    } 
}; 

class FullMtx: public Mtx { 
    double** mx; 
public : 
    FullMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn] ; 
     for (int i=0; i<dimn; i++) mx[i] = new double [dimn]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j<dimn; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { return mx[i] [j]; } 
}; 

class SymmetricMtx : public Mtx { 
    // store only lower triangular part to save memory 
    double** mx ; 
public : 
    SymmetricMtx(int n) { 
     dimn = n; 
     mx = new double* [dimn]; 
     for (int i=0; i<dimn; i++) mx[i] = new double [i+1]; 
     for (int i=0; i<dimn; i++) 
      for (int j=0; j <= i; j++) 
       mx[i][j] = 0; // initialization 
    } 
    double& operator() (int i, int j) { 
     if (i >= j) return mx[i][j] ; 
     else return mx[j][i]; // due to symmetry 
    } 
}; 

int main() 
{ 
    FullMtx A(1000); 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     A(i,j)=1; 
    cout << "sum of full matrix A = " << A.sum() << '\n'; 

    SymmetricMtx S(1000); // just assign lower triangular part 
    for (int i=0; i<1000; i++) 
     for (int j=0; j<1000; j++) 
     S(i,j)=1; 
    cout << "sum of symmetric matrix S = " << S.sum() << '\n'; 
} 

Wenn ich es laufen, heißt es: kein Spiel für Aufruf ‚(MTX) (int &, int &)‘ Und ich verstehe nicht, was falsch ist und wie sollte ich ändern Sie es? Es sollte mit virtuellen Funktionen geschrieben werden, aber ich weiß nicht, wie ich es richtig schreiben kann. Kann mir jemand helfen? Dieses Programm sollte die Summe aller Elemente der FullMatrix und SymmetricMatrix zählen.

+0

'zurück static_cast (* dies);' macht überhaupt keinen Sinn. –

+0

warum nicht? wie soll ich das ändern? – Caboom

+0

@Paula Es ist äquivalent zu 'return * this;'. Es ist nicht klar, was Sie erwarten. – molbdnilo

Antwort

0

virtuelle

virtual double& entry(int i, int j){ 
    return (*this)() (i,j); // error appears here 
} 

hinzufügen virtuelle dort

class Mtx { 
... 
    virtual double& operator() (int i, int j) = 0; 
} 

die abgeleiteten Klassen lassen, dass Betreiber und voala hier entfernen überlasten.

class FullMtx: public Mtx { 
    ... 
    virtual double& operator() (int i, int j) override { return mx[i] [j]; } 
} 

auch das ist nur Unsinn wie bereits erwähnt. Sie werden in denselben Typ umgewandelt, nicht in den abgeleiteten Typ. Außerdem können Sie nicht in abgeleiteten Typ umwandeln, weil Sie in der Basis nicht die Informationen über die vollständige Vererbung haben - was ist, wenn jemand ohne Ihr Wissen von FullMtx ableitet?

Mtx& ReferToDerived() { 
    return static_cast<Mtx&>(*this); 
} 
+0

_ "und voala" _ Das ist ein neues –

+0

Ich fügte hinzu und entfernte diese virtuellen, wie Sie sagten. Aber in Klasse Mtx { ... virtuelles Doppel & Operator() (int i, int j) = 0; } Ich bekomme einen Fehler, der sagt: "'virtuelle' außerhalb der Klasse Deklaration" und "'Double & Operator() (int, int)' muss eine nicht statische Member-Funktion sein". – Caboom