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

Struktury typ niekompletny [C++]

0 głosów
96 wizyt
pytanie zadane 2 lutego w C i C++ przez Mavannkas Obywatel (1,040 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 przez Criss Mędrzec (172,300 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 przez Mavannkas Obywatel (1,040 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 przez adrian17 Mędrzec (194,300 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 przez Mavannkas Obywatel (1,040 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 przez adrian17 Mędrzec (194,300 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 przez Mavannkas Obywatel (1,040 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 przez adrian17 Mędrzec (194,300 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
2 odpowiedzi 607 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Suiko Początkujący (320 p.)
0 głosów
1 odpowiedź 57 wizyt
pytanie zadane 14 maja w C i C++ przez DobryKurczak Obywatel (1,010 p.)
0 głosów
1 odpowiedź 109 wizyt
pytanie zadane 31 sierpnia 2018 w C i C++ przez Paulina42 Nowicjusz (150 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

65,753 zapytań

112,388 odpowiedzi

237,306 komentarzy

46,699 pasjonatów

Przeglądających: 244
Pasjonatów: 9 Gości: 235

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.

...