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

Wzajemne wskaźniki

0 głosów
77 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 (171,900 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 (112,220 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 (112,220 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 VIP (105,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 50 wizyt
0 głosów
2 odpowiedzi 83 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Ne3yPL Użytkownik (830 p.)
0 głosów
0 odpowiedzi 54 wizyt
pytanie zadane 3 lutego 2017 w C i C++ przez Mapet13 Początkujący (260 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

64,180 zapytań

110,580 odpowiedzi

231,742 komentarzy

46,956 pasjonatów

Przeglądających: 260
Pasjonatów: 14 Gości: 246

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.

...