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

Struktury typ niekompletny [C++]

VPS Starter Arubacloud
0 głosów
720 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,100 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,100 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,100 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ź 181 wizyt
pytanie zadane 1 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
2 odpowiedzi 3,663 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Suiko Początkujący (350 p.)
0 głosów
2 odpowiedzi 256 wizyt
pytanie zadane 8 czerwca 2023 w C i C++ przez whiteman808 Obywatel (1,780 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...