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

Wzajemne wskaźniki

Cloud VPS
0 głosów
344 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,820 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,820 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,840 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 285 wizyt
0 głosów
2 odpowiedzi 1,983 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Ne3yPL Użytkownik (830 p.)
0 głosów
0 odpowiedzi 145 wizyt
pytanie zadane 17 stycznia 2022 w C i C++ przez tomek11 Nowicjusz (200 p.)

93,457 zapytań

142,452 odpowiedzi

322,722 komentarzy

62,837 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

Kursy INF.02 i INF.03
...