• 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
106 wizyt
pytanie zadane 2 lutego w C i C++ przez Mavannkas Obywatel (1,070 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 (171,460 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,070 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 Ekspert (203,080 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,070 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 Ekspert (203,080 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,070 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 Ekspert (203,080 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 659 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Suiko Początkujący (320 p.)
0 głosów
1 odpowiedź 58 wizyt
pytanie zadane 14 maja w C i C++ przez DobryKurczak Obywatel (1,010 p.)
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 31 sierpnia 2018 w C i C++ przez Paulina42 Nowicjusz (150 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

67,015 zapytań

113,928 odpowiedzi

241,409 komentarzy

46,959 pasjonatów

Przeglądających: 248
Pasjonatów: 10 Gości: 238

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.

...