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

Wzajemne wskaźniki

VPS Starter Arubacloud
0 głosów
170 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 251 wizyt
0 głosów
2 odpowiedzi 1,322 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Ne3yPL Użytkownik (830 p.)
0 głosów
0 odpowiedzi 122 wizyt
pytanie zadane 17 stycznia 2022 w C i C++ przez tomek11 Nowicjusz (200 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...