为什么我收到错误:无法在赋值时将'std :: string {aka std :: basic_string <char>}'转换为'char *'?

时间:2016-10-03 23:12:54

标签: c++ function linked-list char

我无法让这个程序正确编译。它是一个单独链接列表的程序。这个特殊的功能给了我垃圾,不将其中的东西转换为字符串,但我看不到它。我得到了一个告诉我修复另一个问题的人的帮助,这个函数必须接受字符串而不是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;
        }
}

2 个答案:

答案 0 :(得分:2)

从我假设的错误消息中,您的List_Node类定义如下:

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

您无法将std::string分配给char*(后者是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 :(得分:1)

如果您提供了List_Node的定义,那将会很有帮助。我将假设以下内容。

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

现在,char *类型只是指向某些char数据的指针。它实际上没有为该数据分配任何内存。您无法为std::string变量分配char *值,因为除非您分配内存,否则{{1没有任何地方可以存储字符串。 (然后,即使你已经分配了足够的内存来保存字符串,你仍然需要进行字符串复制而不是普通的赋值,因为你想要复制底层字符串数据,而不仅仅是更改指针地址。 )这意味着您需要自己分配内存,并在完成后删除它,或者使用类似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异常。因此,如果要检查分配是否成功,您实际上需要将其置于try-catch块中,或者使用bad_alloc指示它在失败时返回NULL而不是抛出异常。或者您可以忽略失败并允许内存分配失败的情况导致未处理的异常并终止程序执行,因为您可能无法从内存中耗尽内存恢复,并给出程序的简单性,如果你有一个不断分配内存的无限循环,它们很可能会遇到这个问题。