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

Wzajemne wskaźniki

Mały hosting, OGROMNE możliwości
0 głosów
441 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez Kurczak Użytkownik (940 p.)

Cześć, ostatnio napotkałem taki problem przy projekcie:
Robiłem  "bazę danych" biblioteki, w C++. Miałem klasę zamówienie, która zawierała wskaźnik do klasy czytelnik. Aby ułatwić kasowanie zamówień przy kasowaniu czytelnika, chciałem w klasie czytelnik zrobić listę pointerów na klasę zamówienie. Niestety pomysł wydaje się prosty jedynie w teorii, bo w praktyce jest trochę inaczej, bo nie mogłem zadeklarować typu pointera, który dopiero będę tworzył "poniżej". Jedyny pomysł na jaki wpadłem to stworzyć oddzielną listę, relacji, ale da się to obejść inaczej? 

class Czytelnik
{
  Lista_pointerów * zamowienia;
   .
   .
   .
}

class Zamowienie
{
   Czytelnik * czytelnik;
   .
   .
   .
}


class Lista_pointerow
{
   Zamowienie *ptr_zamowienie;
   Lista_pointerow *head;
   Lista_pointerow *next;
}

 

3 odpowiedzi

+1 głos
odpowiedź 7 czerwca 2018 przez criss Mędrzec (172,570 p.)

Wystarczy, że wcześniej tylko zadeklarujesz potrzebną ci klasę (zdefiniowaną gdzieś np. poniżej). Do utworzenia wskaźnika na typ T nie potrzebujesz definicji typu T, a jedynie deklaracji, że taki istnieje. Jest tak dlatego, że wskaźnik to zawsze typ liczb całkowitych tej samej długości. A więc:

class List_pointerow;

class Czytelnik
{
   Lista_pointerow* zamowienia;
};

class List_pointerow
{
//definicja
};

 

+1 głos
odpowiedź 7 czerwca 2018 przez RafalS VIP (122,780 p.)

Najprościej obejść to deklaracjami wyprzedzającymi. Kompilator zaakceptuje wskaźnik do typu bez znajomości definicji tego typu. Musi tylko mieć jego deklaracje. Dodaj coś takiego na początek:

class Lista_pointerow;
class Czytelnik
{....
0 głosów
odpowiedź 7 czerwca 2018 przez Kurczak Użytkownik (940 p.)
Dzięki wielkie. Zagadka rozwiązana, a jak wygląda praktyka? Lepiej zrobić oddzielną listę relacji czy takie przechowywanie zamówień na poziomie czytelnika jest lepsze? Może wykorzystuje się zupełnie co innego?
komentarz 8 czerwca 2018 przez RafalS VIP (122,780 p.)
Na pewno nie wyważa się otwartych drzwi i zamiast implementować za każdym razem listę używa się std::list.
komentarz 8 czerwca 2018 przez mokrowski Mędrzec (158,960 p.)
Krótko:

1. Unika się relacji cyklicznych bo tworzą poważne problemy przy testowaniu.

2. Podejmuje się decyzję kto jest właścicielem danych. U Ciebie nie widać czy Czytelnik jest właścicielem Zamówień czy odwrotnie.

Podobne pytania

0 głosów
0 odpowiedzi 331 wizyt
0 głosów
2 odpowiedzi 2,312 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Ne3yPL Użytkownik (830 p.)
0 głosów
0 odpowiedzi 201 wizyt
pytanie zadane 17 stycznia 2022 w C i C++ przez tomek11 Nowicjusz (200 p.)

93,715 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,258 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...