• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konstruktor kopiujący i lista pozwiazana

Object Storage Arubacloud
0 głosów
678 wizyt
pytanie zadane 9 sierpnia 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)
edycja 9 sierpnia 2016 przez SebekMakaron

Witam mam problem z przekopiowaniem obiektu a dokładnie listy powiązanej oto co udało mi się stworzyć:

class WektorInt
{
public:
     WektorInt(); //Konstruktor
     WektorInt(int ilosc); // Konstruktor z wartoscia poczatkowa
     ~WektorInt(); //Destruktor
     WektorInt(const WektorInt& klasa); //konstruktor kopiujacy

     Wezel* Pobierz(int id); //Pobiera index i zwraca wartosc
     Wezel* Ustaw(int id, int wart); //Pobiera wartosc i zapisuje ja pod podanym indexem
     Wezel* Dodaj(); //Dodaje element na koniec
     Wezel* Wypisz(); //wypisuje liste
private:
     int identyfikator;
     Wezel* w_wektor;
     Wezel* w_poczatek;
};

plik .cpp - implementacja (Brak całego pliku aby nie zaśmiecać)

Wezel* Stworz(Wezel* w_nastepny, int id)
{
     Wezel* nowy = new Wezel;
     nowy->index = id;
     nowy->wartosc = rand()%100;
     nowy->w_wezel = w_nastepny;
     return nowy;
}

WektorInt::WektorInt()
{
     w_wektor = NULL;
     for(int i=0; i<32; i++)
     {
          w_wektor = Stworz(w_wektor, i+1);
     }
     identyfikator = w_wektor->index;
     w_poczatek = w_wektor;
}

WektorInt::WektorInt(int ilosc)
{
     w_wektor = NULL;
     if(ilosc <= 100)
     {
          for(int i=0; i<ilosc; i++)
          {
               w_wektor = Stworz(w_wektor, i+1);
          }
          identyfikator = w_wektor->index;
     }
     w_poczatek = w_wektor;
}

WektorInt::WektorInt(const WektorInt& klasa)
     :w_wektor(NULL)
{
     Wezel* w_itr = klasa.w_wektor;
     while(w_itr != NULL)
     {
          w_wektor = w_itr;
          w_itr = w_itr->w_wezel;
     }
}

 

 

1
komentarz 9 sierpnia 2016 przez Ehlert Ekspert (212,670 p.)
Zaraz spojrzę w palantirze jak wygląda klasa wektor.

2 odpowiedzi

+1 głos
odpowiedź 9 sierpnia 2016 przez obl Maniak (51,280 p.)
WektorInt::WektorInt(const WektorInt& klasa)
     :w_wektor(NULL)
{
     Wezel* w_itr = klasa.w_wektor;
     while(w_itr != NULL)
     {
          w_wektor = w_itr;
          w_itr = w_itr->w_wezel;
     }
}

Niczego nie kopiujesz tutaj, ty po prostu przepisujesz wskaźnik do pamięci, która prawdopodobnie została dynamicznie przydzielona za pomocą operatora new. Takie coś kończy się zazwyczaj poważnym błędem. I tak w ogóle co to ma być:

     while(w_itr != NULL)

To już instrukcji warunkowych nie ma w C++, że musiałeś pętli while użyć?

To co powinieneś zrobić powinno mniej więcej tak wyglądać:

WektorInt::WektorInt(const WektorInt& klasa)
     :w_wektor(NULL)
{
     if(klasa.w_wektor)
     {
          w_wektor = new Wezel;
          (*w_wektor) = *klasa.w_wektor; // aby to zadziałało operator podstawiania dla klasy Wezel musi być obsłużony
     }
}

 

0 głosów
odpowiedź 9 sierpnia 2016 przez criss Mędrzec (172,590 p.)
edycja 9 sierpnia 2016 przez criss

Problem? Tzn? Nie kompiluje, nie kopiuje? Poza tym skąd mamy wiedzieć czym jest ten WektorInt? Jakiekolwiek informacje poza "mam problem, napraw"?

Tak ja ci napisał @obl - nic nie kopiujesz, a jedynie przekazujesz wskaźniki z kopiowanego obiektu do nowego. Problem w tym, że ,jak mi sie wydaje, wszystko co było pod wskaźnikami jest usuwane w destruktorze. Tak więc jeśli któryś z obiektów zostanie zniszczony, wszystkie pozostałe też tracą swoje dane.

Napisałem podobną klase. Kopiuje wszystko jak trzeba, ale program crashuje sie na końcu, wiec cos jest nie tak. Niestety nie jestem w stanie znaleźć błędu. Mimo wszystko może cie naprowadzi na jakiś tor...

struct Con
{
  struct Node
  {
    Node* next;
    int val;
  };

  Node* start;

  Con() : start(nullptr)
  {
     for(int i=0; i<30; i++)
     {
          start = create(start);
     }
  }

  ~Con()
  {
     Node* ptr = start;
     while(ptr)
     {
        delete ptr;
        ptr = ptr->next;
     }
   }

   Con(const Con& _other) : start(new Node)
   {
       *start = *(_other.start);
       Node* otherItr = _other.start;
       Node* itr = start;

       while(otherItr->next)
       {
           itr->next = new Node;
           *(itr->next) = *(otherItr->next);
           otherItr = otherItr->next;
           itr = itr->next;
       }
   }

   void show()
   {
     Node* ptr = start;
     while(ptr)
     {
        std::cout << ptr->val << '\n';
        ptr = ptr->next;
     }
   }

  friend Con::Node* create(Con::Node* w_nastepny)
{
     Con::Node* nowy = new Con::Node;
     nowy->val = rand() % 100;
     nowy->next = w_nastepny;
     return nowy;
}

};

 

Podobne pytania

0 głosów
4 odpowiedzi 16,751 wizyt
0 głosów
1 odpowiedź 421 wizyt
pytanie zadane 28 kwietnia 2018 w C i C++ przez konu33 Nowicjusz (210 p.)
–1 głos
1 odpowiedź 802 wizyt

92,536 zapytań

141,377 odpowiedzi

319,455 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...