2017-05-12 6 views
0

so habe ich ein Problem mit diesem:Ausnahmen im Konstruktor C++

class Exception{ 
    private : string message; 
    public : 
    Exception(); 
    Exception(string str); 
    string what(); 

}; 
class Something{ 
public : Something(int m) throw(Exception); 
....} 

und in der CPP-Datei:

Exception::Exception() 
    { 
     message="cant divide by 0"; 
    } 
    Exception::Exception(string str) 
    { 
     message = str; 
    } 
    Exception:string what() 
    { 
     return message; 
    } 

und dann habe ich versucht, es in einigen Konstruktor zu verwenden

Something::Something(int m) throw(Exception) 
    { 
     if (m==0) 
     { 
      throw Exception(); 
     } 
    }; 

und in der Hauptsache

... 
catch(Exception obj){ 
    cout<<obj.what(); 

und es zeigt "Exception" nennt keinen Typ und 'obj' wurde nicht erklärt und ich frage mich warum.

+1

Ihre 'Exception' von' std :: exception' erben müssen in try/catch verwendbar zu sein ... – Charles

+4

@ C650 Nein, Ausnahme ist völlig in Ordnung, so wie es ist . – 1201ProgramAlarm

+0

Fügen Sie die Ausnahme-Header-Datei in Ihre Haupt-cpp-Datei ein? – 1201ProgramAlarm

Antwort

0

Die Ausnahmeklasse ist möglicherweise unvollständig.

Es sieht für mich nicht wie Exception :: what() korrekt definiert ist.

Try ...

string Exception::what() 
{ 
    return message; 
} 

Auch, wie andere erwähnt haben, in C++ Sie müssen nicht definieren, was eine Funktion wie in Java wirft. Sehen Sie diese Frage für weitere Details ...

Throw keyword in function's signature

Something::Something(int m) 
{ 
    if (m==0) 
    { 
     throw Exception(); 
    } 
}; 

Auch der Regel würde ich einen Verweis auf die ausgelöste Ausnahme fangen, wenn es ein primitiver Typ ist. Dadurch vermeiden Sie, eine Kopie der Ausnahme zu erstellen.

Versuchen ...

... 
catch(Exception& obj) { 
    cout << obj.what(); 
} 
+0

Sollte wahrscheinlich von const-referenz fangen, aber da Ausnahme-Objekte sowieso unveränderlich sein sollten, ist es wohl nicht so wichtig. –