Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator= в связном списке, теряются указатели, наверное... 
:(
    Опции темы
wowka19
Дата 21.1.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



есть класс реализующий двусвязный список

что-то типа:

Код

class Node {
    private:
        Node * nextNode;
        Node * prevNode;

    public:
        static Node * head;
        static Node * tail;

        Node & operator=(const Node &);
};


в конструкторе определяются nextNode и prevNode.
в деструкторе также происходит переопределение указателей соседних узлов на удаляемый узел.

Проблема:
Насколько мне известно при операции присвоения A = B, срабатывает деструктор A.
И уже в теле метода "operator=()" указатели на соседние объекты недоступны, а они мне нужны!
как быть?
PM MAIL   Вверх
Result
Дата 21.1.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 3
Всего: 5



A = B; это одно и тоже что A.operator=(B)
Деструкторы вызываются при выходе из области видимости локального объекта или оператором delete для объекта из кучи или при раскрутке стека при выбросе исключения (если объект статический то кажется при выходе из main, это нужно проверить и для глобальных тоже).
Потому смотри что происходит в операторе присвоения. 


Это сообщение отредактировал(а) Result - 21.1.2012, 14:28
PM   Вверх
wowka19
Дата 21.1.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



То есть мне необходимо в operator=(const Node &) освобождать всю память самому?

типа:

class Node {
    Type * data;
}

Node & operator=(const Node & rNode) {
    delete data;
    Type * new_data = new Type(rNode.data); // конструктор копирования

    Node * newNode = new Node();
    newNode->data = new_data;

    return * newNode;
}

Блин! НЕ ПОНЯТНО!
Почему нельзя сделать VOID operator=(), раз все переопределения можно сделать в самом теле operator'а?
PM MAIL   Вверх
Albor
Дата 21.1.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(wowka19 @  21.1.2012,  12:47 Найти цитируемый пост)
Насколько мне известно при операции присвоения A = B, срабатывает деструктор A.

Почему срабатывает деструктор? Объект А разве уничтожается? Или вы хотите нагрузить этот оператор каким-то иным назначением, чем получение копии.  
Цитата(wowka19 @  21.1.2012,  13:37 Найти цитируемый пост)
Почему нельзя сделать VOID operator=(), раз все переопределения можно сделать в самом теле operator'а? 

А как же, например, такое выражение A=B=C, если оператор не будет ни чего возвращать.

PM MAIL ICQ   Вверх
Result
Дата 21.1.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 3
Всего: 5



Прочти "Наиболее эффективное использование C++ 55 верных советов ..." глава 2 и 3. Найдешь там ответы на свои вопросы в  понятной и простой форме. 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.