2009-10-11 110 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); 

這種方式是最優選的,因爲它是最健壯和至少容易出錯。你沒有記憶可以直接管理,也不用擔心太大的值。

相關問題