如何将指针函数转换为类函数? 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函数定义为类成员,以后用于函数指针?