2016-10-03 632 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,而不是抛出异常。或者你可以忽略失败并允许内存分配失败的情况导致未处理的异常并终止程序执行,因为无论如何,你可能无法从系统内存不足中恢复,并且由于简单你的程序,如果你有一个连续分配内存的无限循环,可能只会遇到这个问题。

相关问题