2016-05-12 52 views
1

每当我尝试此代码来捕获类类型为异常,我会收到一条错误消息为“从字符串常量到'char *'不推荐使用的转换”。作为C++中的异常类类型中的错误

为什么是这样以及如何避免?

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

回答

1

字符串文字应传递到const char*不是char*the former is the correct type),所以改变构造函数签名

Error(int c , const char* p); 

和成员变量

const char *err_desc; 

或者你可以通过std::string,我会推荐。

+1

...或更好,做正确的事情,并从std :: runtime_error派生 –

1

在C++中,字符串文字的类型是const char的数组,因此通常您会使用它来初始化const char*而不是char*。你可以用一个字符串文字初始化一个char*的特殊规则,这个规则并不是真正的正确,它是为了与C向后兼容,其中字符串文字是普通的数组char。它不赞成使用C++ 03,并在C++ 11中删除。

你应该改变err_descError的构造函数的参数从char*const char*,这将使得该警告消失,以及使你的代码常量纠正和防止它打破了C++ 11。