2009-10-11 114 views
0

我根本看不出为什么会出现这个错误。帮我调试 - 从'const char *'无效转换为'char *'

Widget.cpp: In constructor 'Widget::Widget(Generic, char*, int, int, int, QObject*)': 
Widget.cpp:13: error: invalid conversion from 'const char*' to 'char*' 

根据Widget的构造函数,我没有'const char *'。

class Widget: public QObject { 
    Q_OBJECT 
    Q_PROPERTY(char *col READ getCol WRITE setCol) 
    Q_PROPERTY(char *row READ getRow WRITE setRow) 
    Generic visitor; 
    char *_name; 
    char *_widget_base; 
    int _row; 
    int _col; 
    int _type; 
    public: 
    Widget(Generic visitor, char *name, int row, int col, int type, QObject *parent); 
    char* widgetBase() const; 
    QString getCol() const; 
    void setCol(const QString &col); 
    QString getRow() const; 
    void setRow(const QString &row); 

}; 

Widget::Widget(Generic v, char *name, int row, int col, int type, 
    QObject *parent = 0) { 
    visitor = v; 
    std::string str(name); 
    int pos1 = str.find(":"); 
    int pos2 = str.rfind(":"); 
    _widget_base = str.substr(pos1, pos2-pos1).c_str(); 
    _name = name; 
    _row = row; 
    _col = col; 
    _type = type; 
} 
+0

哪一行是第13行? – JesperE 2009-10-11 18:39:05

回答

5

这是一个const char *

str.substr(pos1, pos2-pos1).c_str(); 
4

除了编译器错误,这已经回答了,你的代码有一些其他的问题。 (至少,假设你发布的代码是接近或正是你实际使用在你的项目是什么)

即使更改_widget_base是一个常量指针,这行代码是一个问题:

_widget_base = str.substr(pos1, pos2-pos1).c_str(); 

substr返回一个临时的字符串对象。 c_str()的结果仍属于该临时字符串。并且,在写入行的方式中,临时字符串对象在行被执行后将被销毁。因此,问题在于_widget_base将被指向一个已经被删除并且可能在任何时候被重用的内存区域。

根据您传递到Widget构造函数的内容,您可能也会遇到_name类似的问题。

所以你可以做的三件事情有一个和_widget_base_name

1),因此它不会被任何其他对象管理动态自己分配内存。

std::string temp = str.substr(pos1, pos2-pos1); 
_widget_base = new char[temp.length()+1]; 
strcpy(_widget_base, temp.c_str()); 

当然,您还需要在Widget的析构函数中管理这个内存的删除。如果在Widget存在时可以更改此值,也可能重新分配。

2)使这些成员变量字符数组而不是指针。这种方式内存是Widget的永久部分,不需要管理。当然,您还必须确定阵列的大小。

char _name[a big enough value]; 
char _widget_base[a big enough value]; 

然后:

std::string temp = str.substr(pos1, pos2-pos1); 
strcpy(_widget_base, temp.c_str()); 

3)使那些成员变量字符串对象。

std::string _name; 
std::string _widget_base; 

然后:

_widget_base = str.substr(pos1, pos2-pos1); 

这种方式是最优选的,因为它是最健壮和至少容易出错。你没有记忆可以直接管理,也不用担心太大的值。

相关问题