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

Wzajemne wskaźniki

Object Storage Arubacloud
0 głosów
184 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,590 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 (155,460 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 253 wizyt
0 głosów
2 odpowiedzi 1,403 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Ne3yPL Użytkownik (830 p.)
0 głosów
0 odpowiedzi 123 wizyt
pytanie zadane 17 stycznia 2022 w C i C++ przez tomek11 Nowicjusz (200 p.)

92,565 zapytań

141,417 odpowiedzi

319,600 komentarzy

61,950 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!

...