2016-05-12 10 views
1

Immer wenn ich diesen Code versuche, den Klassentyp als Ausnahme abzufangen, erhalte ich eine Fehlermeldung als "veraltete Konvertierung von String-Konstante in 'char *'".Fehler beim Klassentyp als Ausnahme in C++

Warum ist es so und wie kann es vermieden werden?

#include<iostream> 
#include<cstring> 
#include<cstdlib> 
using namespace std; 
class Error 
{ 
int err_code; 
char *err_desc; 
public: 
     Error(int c , char* p) 
     { 
      err_code=c; 
      err_desc=new char(strlen(p)); 
      strcpy(err_desc,p); 
     } 
     void display(void) 
     { 
      cout<<err_code<<"done successfully"<<err_desc; 
      } 
     }; 
int main() 
{ 
int x; 
try 
{ 
    cout<<"\n press any key to avoid exception except 99"; 
    cin>>x; 
    if(x=99) 
    throw Error(x,"Exception"); 
} 
catch (Error e) 
{ 

    cout<<"\n exception caught successfully"; 
    e.display(); 
    } 

    return 0; 
} 

Antwort

1

Ein Stringliteral sollte in eine const char* kein char* (the former is the correct type) so ändern Sie den Konstruktor Signatur

Error(int c , const char* p); 

und die Membervariable

const char *err_desc; 

Oder Sie können übergeben werden Pass um std::string, die ich empfehlen würde.

+1

... oder noch besser, machen Sie das Richtige und leiten Sie von std :: runtime_error ab –

1

In C++ ist der Typ eines Zeichenfolgenliterals ein Array von const char, also normalerweise würden Sie es verwenden, um eine const char*, nicht eine char* zu initialisieren. Die spezielle Regel, dass Sie nichtsdestotrotz eine char* mit einem String-Literal initialisieren können, das nicht wirklich const-correct ist, ist aus Gründen der Rückwärtskompatibilität mit C, in dem String-Literale Arrays von Plain char sind. Es wurde ab C++ 03 veraltet und in C++ 11 entfernt.

Sie sollten err_desc und das Argument von Error ‚s Konstruktor char*-const char*, ändern, die die Warnung abzuschalten sowie um Ihren Code const zu korrigieren und verhindern, dass es zu brechen in C++ 11 machen.

Verwandte Themen