2013-08-22 2 views
0

Я использую алгоритм сортировки слияния для сортировки связанного спискаИзменение объекта внутри метода

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. Есть ли альтернативный способ?

Функция деления используется для разделения списка на две части и сохранения их в p и q.

+0

Нужны ли настоящие указатели? Даже если они есть, «новый» - нет. – chris

+0

Назначение 'this' не будет работать! Создайте функцию 'merge_sort()' как статический член класса или вне класса 'node'. –

+0

@chris Да, они необходимы для хранения адреса двух половинок и изменения их в функции разделения. – zed111

ответ

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 =, который переназначает значение, удерживаемое текущим объектом, вместо того, чтобы пытаться заменить существование текущего объекта. Кроме того, оператор присваивания переходов, чтобы сделать его быстрым.

Смежные вопросы