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

Struktury typ niekompletny [C++]

Object Storage Arubacloud
0 głosów
740 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Mavannkas Bywalec (2,290 p.)

Hej, mam problem z zrozumieniem pewnego aspektu działania struktur, mianowicie jak działają struktury które odnoszą się same do siebie np.

struct przyklad
{
    przyklad * cps;
};

Nie rozumiem tego... Wiem tylko, że to typ niekompletny i niewiele mi to mówi odnośnie działania. 

Kolejny pytaniem jest. Dlaczego taki zapis tworzy typ kompletny i jest poprawny (chyba) w końcu typ dalej jest nieznany.

struct A;

struct B
{
    A * a;
};

struct A
{
    B * b;
};

I dlaczego w takim przypadku można korzystać tylko ze wskaźników? 

Z góry dziękuje za odpowiedź :D (W końcu trafiłem na niezrozumiałe dla mnie zagadnienie :,().

2 odpowiedzi

+1 głos
odpowiedź 2 lutego 2019 przez criss Mędrzec (172,590 p.)

Wskaźnik zawsze wygląda tak samo - kilka bajtów jako integer. Dla tego do stworzenia wskaźnika X (tj. X*) potrzebujesz tylko deklaracje X, a już nie koniecznie jak właściwie X wygląda.

struct przyklad
{
    przyklad * cps;
};

Dostajesz jakiś błąd tutaj?

Odnośnie drugiego:

I dlaczego w takim przypadku można korzystać tylko ze wskaźników? 

 A jest zadeklarowane (`struct A;`) przed linią `A* a;`, a przed linią `B* b;`, B jest nawet całkowicie zdefiniowane. Dlatego jest ok. Kluczowa jest deklaracja w pierwszej linii.

komentarz 2 lutego 2019 przez Mavannkas Bywalec (2,290 p.)
Raczej sam dostrzegam błąd logiczny... Po prostu nie potrafię sobie wyobrazić jakby to mogło działać :/
0 głosów
odpowiedź 2 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Nie rozumiem tego... Wiem tylko, że to typ niekompletny i niewiele mi to mówi odnośnie działania. 

Wygląda na kompletny. Masz strukturę z wskaźnikiem na obiekt tego samego typu. Nie ma tutaj nic problematycznego.

Dlaczego taki zapis tworzy typ kompletny i jest poprawny (chyba) w końcu typ dalej jest nieznany.

Jest "znany". Czemu myślisz, że nie jest?

komentarz 2 lutego 2019 przez Mavannkas Bywalec (2,290 p.)
Ponieważ w żadnym miejscu nie ma bezpośredniej deklaracji wskaźnika np. int *a coś czuje, że to tak niekoniecznie działa.
komentarz 2 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Ponieważ w żadnym miejscu nie ma bezpośredniej deklaracji wskaźnika np. int *a 

Nie rozumiem. Jest dokładnie tutaj:

przyklad * cps;

 

komentarz 2 lutego 2019 przez Mavannkas Bywalec (2,290 p.)
Popraw mnie jeśli źle to rozumiem. Czyste wskaźniki nie potrzebują określonego typu zmiennych (int, double itd) i kompilator sam to rozpoznaje? I ta struktura przechowuje tylko lokalizacje a to co dana lokalizacja "trzyma" jest definiowane w innej części progrmu?
komentarz 2 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Czyste wskaźniki nie potrzebują określonego typu zmiennych (int, double itd) i kompilator sam to rozpoznaje? 

`przyklad` jest typem zmiennej. Tylko że na linii 3 to jest jeszcze niepełny typ.

Inną sprawą jest że tak, możesz definiować wskaźnik na niepełny typ (na przykład tylko zadeklarowany przez `struct asdf;`). Tak, w tym miejscu programu nie ma i nie jest potrzebna pełna definicja typu `przyklad` (która staje się pełną po zamykającym } na linii 4)

Podobne pytania

0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 1 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
2 odpowiedzi 3,699 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Suiko Początkujący (350 p.)
0 głosów
2 odpowiedzi 271 wizyt
pytanie zadane 8 czerwca 2023 w C i C++ przez whiteman808 Obywatel (1,820 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

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

...