如何将指针从 void 函数传递到另一个 C++

Posted

技术标签:

【中文标题】如何将指针从 void 函数传递到另一个 C++【英文标题】:How to pass a pointer from a void function to another C++ 【发布时间】:2018-10-30 22:08:29 【问题描述】:

考虑以下代码:

void List::insertFront(int key)

    Node *tmp_node = new Node;

    tmp_node->key = key;
    tmp_node->next = head->next;
    tmp_node->prev = head;
    head->next = tmp_node;
    _size++;

此函数将一个元素添加到列表的开头,我想在另一个函数中捕获列表的第一个元素并将其删除。为此,我编写了以下代码:

bool List::getFront(int &key)

    if (head->next->key == key)
    
        Node *tmp_node = new Node;

        head->next = tmp_node->next;
        delete tmp_node;
        delete head->next;
        _size--;
        return true;
    
    else return false;

正如您所看到的,每次我创建一个使用新空列表的新节点时,但我想使用在前一个函数中创建的列表。

如何将节点从insertFront() 传递到getFront()

【问题讨论】:

insertFront() 应该更新 head。这是列表的起点,可通过getFront() 访问 列表的第一个节点似乎是head->next 这个问题不太清楚。你知道insertFrontgetFront 是类方法并且你可以访问类的成员吗?你知道如何从函数中返回值吗? 为什么getFront 会创建一个新的Node?这没有任何意义。 getFront 只是从列表中删除节点[如果匹配],但它会被丢弃。那有用吗?返回匹配的节点会更好(例如Node * List::getFront(int &key) 并且只是做:if (head->next->key == key) Node *tmp = head->next; head->next = tmp->next; _size--; return tmp; else return NULL; 另外,在做head->next->key 之前你不应该检查head->next 的非空值吗? 【参考方案1】:

您的getFront() 代码完全错误。你需要更多类似的东西:

bool List::popFrontIfMatches(int key)

    Node *tmp_node = head->next;
    if ((tmp_node) && (tmp_node->key == key))
    
        if (tmp_node->next)
            tmp_node->next->prev = tmp_node->prev;
        if (tmp_node->prev)
            tmp_node->prev->next = tmp_node->next;
        head->next = tmp_node->next;
        delete tmp_node;
        _size--;
        return true;
    
    else
        return false;

话虽如此,您为什么将head->next 视为列表中的第一个节点,而不是像通常的做法那样将head 本身视为?

void List::insertFront(int key)

    Node *tmp_node = new Node;    
    tmp_node->key = key;
    tmp_node->next = head;
    tmp_node->prev = NULL;
    head = tmp_node;
    _size++;


bool List::popFrontIfMatches(int key)

    Node *tmp_node = head;
    if ((tmp_node) && (tmp_node->key == key))
    
        if (tmp_node->next)
            tmp_node->next->prev = tmp_node->prev;
        if (tmp_node->prev)
            tmp_node->prev->next = tmp_node->next;
        head = tmp_node->next;
        delete tmp_node;
        _size--;
        return true;
    
    else
        return false;

【讨论】:

以上是关于如何将指针从 void 函数传递到另一个 C++的主要内容,如果未能解决你的问题,请参考以下文章

使用 void 指针将字符串从 C++ 传递到 C#

将指针从一个函数传递到另一个函数

提升 C++。将带有签名指针的成员函数指针传递给函数

将c ++引用的地址传递给指针

C++ CreateThread函数如何传递this指针作为参数

C ++:将成员函数作为普通函数指针传递的闭包