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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Связанный список, и копирующие конструкторы 
:(
    Опции темы
observateur
Дата 3.11.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct link                           //one element of list
   {
   int data;                          //data item
   link* next;                        //pointer to next link
   };
////////////////////////////////////////////////////////////////
class linklist                        //a list of links
   {
   private:
      link* first;                    //pointer to first link
   public:
      linklist()                      //no-argument constructor
         { first = NULL; }            //no first link
      ~linklist();                    //destructor
      void additem(int d);            //add data item (one link)
      void display();                 //display all links
   };
//--------------------------------------------------------------
void linklist::additem(int d)         //add data item
   {
   link* newlink = new link;          //make a new link
   newlink->data = d;                 //give it data
   newlink->next = first;             //it points to next link
   first = newlink;                   //now first points to this
   }
//--------------------------------------------------------------
void linklist::display()              //display all links
   {
   link* current = first;             //set ptr to first link
   while( current != NULL )           //quit on last link
      {
      cout << endl << current->data;  //print data
      current = current->next;        //move to next link
      }
   }
//--------------------------------------------------------------
linklist::~linklist()                 //destructor
   {
   link* current = first;             //set ptr to first link
   while( current != NULL )           //quit on last link
      {
      link* temp = current;           //save ptr to this link
      current = current->next;        //get ptr to next link
      delete temp;                    //delete this link
      }
   }
////////////////////////////////////////////////////////////////
int main()
   {
   linklist li;       //make linked list

   li.additem(25);    //add four items to list
   li.additem(36);
   li.additem(49);
   li.additem(64);

   li.display();      //display entire list
   cout << endl;
   return 0;
   }

Допустим, мы заполняем объект этого класса данными, а затем присваиваем один класс целиком другому, используя стандартный оператор присваивания :
list2=list1;
Допустим, что впоследствии мы удалим объект класса list1. Можем ли мы все еще использовать list2  для доступа к введенным данным? Увы, нет, так как при удалении list1  все его ссылки были удалены. Единственное, что было объекту linklist про удаленный объект, это указатель на него. Но его удалили, указатель в list2 стал недееспособным, и все попытки получить доступ к данным приведут к получению мусора вместо данных, а в худшем случае – к зависанию программы.
Один из способов избежать этих проблем- перегрузить оператор присваивания, что бы он вместе с объектом копировал бы все его ссылки. Но тогда придется пройти всей цепочке, поочередно копируя все ссылки. Как отмечалось ранее, следует также перегружать конструктор копирования. Чтобы была возможность удалять объекты linklist в main(), можно создавать их с помощью указателя и new. В таком случае проще будет проверять работу новых операций. Не переживайте, если обнаружите, что в процессе копирование порядок следования данных изменился.
Понятно, что копирование всех данных не является самым эффективным решением проблемы с точки зрения экономии памяти.
Но решения этого упражнения таким путем с точки зрения обучения   важно.
помогите мне понять суть этого упражнения....




Это сообщение отредактировал(а) alexeis1 - 4.11.2006, 01:08
PM MAIL   Вверх
Rockie
Дата 4.11.2006, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



observateur,  на этом сайте есть хорошие статьи про копирующие конструкторы и не только, "Копирование и присваивание".

Это сообщение отредактировал(а) Rockie - 4.11.2006, 01:06


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Гарри
Дата 4.11.2006, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вместо того чтобы спросить напрямую, ставят перед проблемой, и разбирайся. Неотечественная постановка задачи, судя по всему?

Темы для изучения тут копи конструктор и переписывание операторов.

Вот примерчик, для оператора присваивания, может быть поможет ...

Код

class Complex
{
    double real;
    double imag;
  public:
    Complex(...);
    Complex& operator = (const Complex& src);  
    ....
};

Complex& Complex::operator = (const Complex& src)
{
    real = src.real;   
    imag = src.imag;   
    return *this;      
}



Модератор: пожалуйста, выбирайте тип подсветки

Это сообщение отредактировал(а) alexeis1 - 4.11.2006, 02:15
PM MAIL   Вверх
observateur
Дата 4.11.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



дело в том что мне не интересно кто то решил для меня упражнения. просто мне не понятно некоторые слова на пример
Цитата(observateur @  3.11.2006,  23:33 Найти цитируемый пост)
а затем присваиваем один класс целиком другому, используя стандартный оператор присваивания :

а как можно присваивать класс целиком другому?
PM MAIL   Вверх
Alexeis
Дата 4.11.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(observateur @  4.11.2006,  08:33 Найти цитируемый пост)
а как можно присваивать класс целиком другому? 

Можно присваивать объекты, а не классы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
observateur
Дата 4.11.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



тогда у меня прозба к знатокам будьте любезны помогите мне решат эту проблему...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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