【问题标题】:Changing an object inside a method更改方法内的对象
【发布时间】:2013-08-22 16:48:33
【问题描述】:

我正在使用归并排序算法对链表进行排序

void node::merge_sort()
{
    if (head == NULL || head->next == NULL)
    {
        return;
    }
    node *p = new node;
    node *q = new node;
    this->divide(&p, &q);
    p->merge_sort();
    q->merge_sort();
    this=merge_lists(p, q);
}

但我必须更改此方法中的对象,因为我输入了this=merge_lists(p,q)。但这给出了一个错误,说 nolvalue。有没有其他办法?

divide函数用于将列表分成两部分,分别存放在p和q中。

【问题讨论】:

  • 这里的指针真的有必要吗?即使是,new 也不是。
  • 分配this 不起作用!将您的 merge_sort() 函数设计为静态类成员或在 node 类之外。
  • @chris 是的,他们需要存储两半的地址并在除法函数中更改它们
  • 你真的把概念搞砸了。 nodehead 是什么? head 是一个 node

标签: c++ algorithm mergesort singly-linked-list


【解决方案1】:

不,您不能重新分配this。类比是,如果我走到你面前说“你现在就是那边的那个身体”。您的回答将是“这甚至没有意义”。你是对的。您要做的是改变当前对象的状态,而不是完全替换它。

此外,这里没有理由分配动态对象。不要那样做。这会使您的代码变慢并且更容易出错。实际上,您的界面似乎根本不需要指针

void node::merge_sort()
{
    if (head == NULL || head->next == NULL)
    {
        return;
    }
    node left, right;
    divide(left, right);
    left.merge_sort();
    right.merge_sort();
    *this = merge_lists(left, right); //this line is the key to answering to your question
}

然后更改您的函数签名:

void node::divide(node** left, node** right);
node merge_lists(node* left, node* right);
node& node::operator=(const node& right_hand_side);

void node::divide(node& left, node& right);
node merge_lists(node& left, node* right);
node& node::operator=(const node& right_hand_side);
node& node::operator=(node&& right_hand_side); //along with this line

这里的键是*this =,它重新分配当前对象持有的值,而不是试图替换当前对象的存在。此外,移动赋值运算符使其更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多