【发布时间】:2020-09-07 07:53:00
【问题描述】:
例如,我有一个 empty 函数来清除链表:
void empty(Node* head) {
if (head->next) { empty(head->next); }
delete head;
head = nullptr;
}
但是后来我为链表创建了一个类,所以现在我不需要传递head 参数:
void empty() {
if (head->next) { empty(head->next); }
delete head;
head = nullptr;
}
但是empty(head->next) 行显然是错误的,因为empty 不接受任何参数。我想到了在函数内部创建一个函数(使用 lambda)的想法,如下所示:
void empty() {
std::function<void(Node*)> emptyWrapper = [&] (Node* l_head) {
if (l_head->next) { emptyWrapper(l_head->next); }
delete l_head;
l_head = nullptr;
};
emptyWrapper(head);
}
但我想知道是否有更好的方法来做到这一点。 Lambdas 最近成为了我的一种想法。
【问题讨论】:
-
"但是后来我为链表创建了一个类,所以现在我不需要传递 head 参数:" 递归函数的 head 和你的类成员不是一回事。他们只共享名字。
-
@CaptainGiraffe
Node* head; empty(head);和MyClass head; head.empty();之间没有区别。 -
创建一个私有辅助函数,使
empty()成为公共世界的接口。 -
如果你坚持使用递归,那么让你的公开函数
empty成为一个包含参数的递归函数的包装器。例如void empty() { empty(head); } … void empty( Node *node ) {…} -
while ( head ) { Node *t = head->next; delete head; head = t; }...实际上你已经在做,但实际上要好一点...如果head已经是nullptr,你的版本将有UB
标签: c++ class recursion singly-linked-list function-definition