Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Связанный список


Автор: observateur 3.11.2006, 23:33
Код

#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. В таком случае проще будет проверять работу новых операций. Не переживайте, если обнаружите, что в процессе копирование порядок следования данных изменился.
Понятно, что копирование всех данных не является самым эффективным решением проблемы с точки зрения экономии памяти.
Но решения этого упражнения таким путем с точки зрения обучения   важно.
помогите мне понять суть этого упражнения....



Автор: Rockie 4.11.2006, 01:03
observateur,  на http://club.shelek.com/view.php?id=49 сайте есть хорошие статьи про копирующие конструкторы и не только, "Копирование и присваивание".

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

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

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

Код

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;      
}



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

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

а как можно присваивать класс целиком другому?

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

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

Автор: observateur 4.11.2006, 22:07
тогда у меня прозба к знатокам будьте любезны помогите мне решат эту проблему...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)