2016-10-03 631 views
-3

我不能讓這個程序正確編譯。這是一個單獨鏈接的程序。這個特殊的功能給我垃圾沒有轉換的東西在字符串中,但我看不到它。我得到了一個人的幫助,他告訴我要解決另一個問題,這個函數必須接受字符串而不是char *。我想我修復了所有與用字符串替換char *有關的錯誤,但我似乎無法修復這最後一個錯誤。請請幫助我! 這裏的問題是功能:爲什麼我會收到錯誤:無法將'std :: string {aka std :: basic_string <char>}'轉換爲'char *'賦值?

List_Node *listTextEditor::create_node(string value)//creates the list elements 
{ 
     struct List_Node *tempNode, *s; 
     tempNode = new(struct List_Node); 
     if (tempNode == NULL) 
     { 
       cout << "Memory not allocated " << endl;//if theres nothing in the list 
       return 0; 
     } 
     else 
     { 
       tempNode->textLine=value ; //This puts stuff in the current node and creates/moves to the next. THIS IS WHERE THE PROBLEM IS!!!!!!!!! 
       tempNode->nextEle = NULL; 
       return tempNode; 
     } 
} 
+0

是textLine一個字符串類的成員數據? – Raindrop7

+3

沒有從'std :: string'到(可變)'char *'的隱式轉換。另外,與你的問題無關:'if(tempNode == NULL)'永遠不能評估爲'true'。看看[新操作員](http://en.cppreference.com/w/cpp/memory/new/operator_new)是做什麼的。 – IInspectable

+0

添加你的類的示例接口 – Raindrop7

回答

2

從錯誤信息我認爲,你List_Node類是有點像這樣定義:

struct List_Node { 
    char* textLine; 
    List_Node* nextEle; 
}; 

您無法分配std::stringchar*(後者是一個C風格的字符串,需要手動內存管理)。由於您使用的是C++,因此請堅持使用字符串類std::string

類定義更改爲這個:

struct List_Node { 
    std::string textLine; 
    List_Node* nextEle; 
}; 


有你的代碼,不會立即與您的錯誤等問題。一旦你將其轉換爲一個合理的實現,它幾乎沒有價值,甚至一個函數調用了:

List_Node *listTextEditor::create_node(string value) { 
    return new ListNode{value, nullptr}; 
} 
1

請將您所提供的List_Node定義是有幫助的。我會假設以下。現在

struct List_Node { 
    char *textLine; 
    List_Node *nextEle; 
}; 

,一個char *類型只是一個指針,指向一些char數據。它實際上並沒有爲該數據分配任何內存。您不能將std::string值分配給char *變量,因爲除非您分配內存,否則該char *沒有任何位置可以存儲字符串。 (然後,即使你已經分配了足夠的內存來保存字符串,你仍然需要做一個字符串拷貝而不是一個普通的賦值,因爲你想拷貝基礎字符串數據,而不僅僅是改變指針地址。)意味着您需要自己分配內存,並在完成時刪除內存,或者使用像std::string這樣的內部自己的內存分配類型。

對於前者,你會做類似這樣的事情,,當刪除列表節點時將被強制爲delete[] textLine

{ 
    tempNode->textLine = new char[value.length()+1]; 
    strcpy(tempNode->textLine, value.c_str()); 
    tempNode->nextEle = NULL; 
    return tempNode; 
} 

對於後者,您只需更改List_Node的定義。

struct List_Node { 
    std::string textLine; 
    List_Node *nextEle; 
}; 

一個不相關的問題是new不返回NULL當它不能分配內存。它拋出了一個bad_alloc異常。因此,如果您想檢查分配是否成功,您實際上需要將其放入try-catch塊中,或使用new (std::nothrow) List_Node來指示它在失敗時返回NULL,而不是拋出異常。或者你可以忽略失敗並允許內存分配失敗的情況導致未處理的異常並終止程序執行,因爲無論如何,你可能無法從系統內存不足中恢復,並且由於簡單你的程序,如果你有一個連續分配內存的無限循環,可能只會遇到這個問題。

相關問題