如何将指针函数转换为类函数? C++

Posted

技术标签:

【中文标题】如何将指针函数转换为类函数? C++【英文标题】:How transform a pointer function to a class function? c++ 【发布时间】:2013-06-07 18:48:19 【问题描述】:

我有这个删除功能:

Node* deleteNode(Node *head, Node *node)

    if (head != 0)
    
        if (head == node)
            head = head->next;
        else
            head->next = deleteNode(head->next, node);
    
    return head;

但为了更清楚(因为我的程序的其余功能都在一个类中),我想把它写成这样:

void List::deleteNode()

    //the code comes here

(我想从单链表的开头删除,不想使用库。)

【问题讨论】:

您的问题不是很清楚 - 您是否在实现自己的 List 类?如果是这样,只需将指向第一个节点的指针保留为类中的成员。不过,您始终必须至少传递一个参数(您要删除的节点)。 他写了“我想从头开始删除”,所以不需要参数,虽然函数名有误导性。 【参考方案1】:

类似

void List::deleteNode()

    /* I suppose you have Node *head in your List class */
    if(head == NULL)
        return;

    Node * temp = head;
    head = head -> next;

    delete temp;

我认为“deleteHead”是这个函数更好的名字。

【讨论】:

哦,谢谢!如果我想删除头部和下面的节点怎么办?我想我需要争论。 你可以删除两次head。【参考方案2】:

我认为你的做法是错误的,你应该首先考虑班级的外观和感觉,然后考虑里面发生了什么。当我考虑将代码放入一个类中时,特别是处理类似列表的代码时,我首先制作一个类需要支持的操作(追加、擦除、查找?、索引?)的心理列表。然后,我开始考虑我希望类具有的接口。然后,将代码放入类中通常是一小步,因为大部分已经由前面的两个步骤决定了。

查看您的代码,我看到返回值仅用于在递归调用后重置前一个元素的next 指针。因此,您可以将该功能一分为二,供列表用户使用,另一种仅供内部使用。这一点很重要,因为这意味着类的接口只需要向外部(“公共”)显示类用户的接口。它在内部做的是自己的事情。这允许您将其从递归更改为迭代(这将更有效),而不会打扰类的用户。

现在,在您的情况下,您有一个要放入课程的列表。您可以从列表中删除元素,您可以在其中通过地址指定元素。这不会破坏元素,而是将其留给调用者(原始指针总是询问所有权问题,但这是一个不同的问题)。其他任何事情对我来说都是未知的,例如如何填充列表或如何分配节点。这给了我这个擦除操作的用例:

List l;
... // fill l
Node* n = ... // some node
l.erase(n);
delete n;

对于列表类型,如下所示:

struct List

    void erase(Node* n)
    
        m_head = doErase(m_head, n);
    
private:
    static Node* doErase(Node* head, Node* node)
    
        ... // your function here
    

    Node* m_head;
;

请注意,仍然缺少一些东西,特别是您希望使您的类不可复制,并且您必须决定当节点为空时(例如 erase() 中的 assert(n);)或不在列表(throw invalid_argument("node not element of list"); 中的do_erase())。不过,我希望这可以帮助您入门。

【讨论】:

以上是关于如何将指针函数转换为类函数? C++的主要内容,如果未能解决你的问题,请参考以下文章

C++:将派生指针转换为 void 指针,然后转换为抽象指针,并访问成员函数

C ++ typedef函数定义为类成员,以后用于函数指针?

如何将指向c数组的指针转换为python数组

C++ 函数指针参数和类继承自动转换

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

C++ 浅拷贝 & 深拷贝