• 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

0 głosów
97 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 VIP (105,150 p.)
Zaraz spojrzę w palantirze jak wygląda klasa wektor.

2 odpowiedzi

+1 głos
odpowiedź 9 sierpnia 2016 przez obl Nałogowiec (26,240 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 VIP (115,140 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 435 wizyt
–1 głos
1 odpowiedź 146 wizyt
+1 głos
3 odpowiedzi 109 wizyt
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,556 zapytań

76,419 odpowiedzi

149,214 komentarzy

18,024 pasjonatów

Przeglądających: 268
Pasjonatów: 19 Gości: 249

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...