2016-10-03 14 views
-3

このプログラムを正しくコンパイルできません。これは、単独でリンクされたリストのプログラム用です。この特定の関数は、文字列に何かを変換しないために私には駄目を与えていますが、私はそれを見ることができません。この関数がchar *の代わりに文字列を受け入れる必要があるという別の問題を解決するように私に言った人から助けを得ました。私は文字列でchar *を置き換えることに関連するすべてのエラーを修正したと思ったが、この最後のものを修正することはできないようだ。私を助けてください!後者は(あなたがchar*std::stringを割り当てることはできませんなぜ私はエラーが発生します: 'std :: string {aka std :: basic_string <char>}'を代入で 'char *'に変換できませんか?

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

:あなたのList_Nodeクラスは、次のように多少定義されていることを、私が想定し、エラーメッセージから

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'と評価できません。 [operator new](http://en.cppreference.com/w/cpp/memory/new/operator_new)の動作を参照してください。 – IInspectable

+0

クラスのサンプルを追加するインターフェイス – Raindrop7

答えて

2

:ここ は、問題の関数であります手動メモリ管理が必要なCスタイルの文字列)。 C++を使用しているので、文字列クラスstd::stringに固執してください。

が、この代わりに、あなたのクラス定義を変更し

:すぐにエラーに関連していないあなたのコード、と他の問題があり

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


。あなたは合理的な実装に変換したら、それはもうほとんども、関数呼び出しの価値がある:あなたが List_Nodeの定義を提供した場合

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

これは参考になります。私は次のことを仮定します。今

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

char *タイプは、いくつかのcharデータへの単なるポインタです。そのデータが格納されるメモリは実際には割り当てられません。char *変数にはstd::stringの値を代入することはできません。メモリを割り当てない限り、文字列を格納する場所がないからです。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; 
}; 

無関係な問題は、それがメモリを割り当てることができないときnewNULLを返さないということです。 bad_alloc例外がスローされます。したがって、割り当てが成功したかどうかを確認するには、実際にtry-catchブロックに入れるか、例外をスローするのではなくNULLを返すようにnew (std::nothrow) List_Nodeを使用する必要があります。または、単にメモリを使い果たしたシステムから復旧できない可能性があるため、失敗を無視して、メモリ割り当てが失敗した場合に未処理の例外が発生し、プログラムの実行が終了することを許可することができますあなたのプログラムの中には、メモリを連続的に割り当てている無限ループがある場合にのみ、この問題に遭遇する可能性があります。

関連する問題