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

Niech mi ktoś to wytłumaczy,proszę.

Object Storage Arubacloud
0 głosów
296 wizyt
pytanie zadane 1 lutego 2018 w C i C++ przez SQnera Początkujący (280 p.)

Dlaczego kompilator zgłasza że struktura nie jest zdefiniowana.

 

using namespace std;
struct MyStruct;


int main()
{

	MyStruct y;
	y.x = 1;
    return 0;
}

struct MyStruct
{
	int x;
};

 

3 odpowiedzi

+1 głos
odpowiedź 1 lutego 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 2 lutego 2018 przez SQnera
 
Najlepsza
struct MyStruct;

To jest deklaracja

struct MyStruct
{
    int x;
};

To jest definicja.

MyStruct y;

Przed użyciem struktury musi być ona zdefiniowana. W C++ie niestety "przed" oznacza że musisz dosłownie umieścić definicję nad pierwszym użyciem.

komentarz 1 lutego 2018 przez jankustosz1 Nałogowiec (35,880 p.)

no dobra a jeżeli by była taka sytuacja?

class A
{
  void funk(B obj)
  {
      // jakies operacje z obj
   }
};

class B
{
  void funk(A obj)
  {
      // jakies operacje z obj
   }
};

Nie pamiętam dokładnie ale było chyba takie coś w c++ jak możliwość zadeklarowania klasy, przez co kompilator nie wywalał błędu.

0 głosów
odpowiedź 1 lutego 2018 przez hhh Gaduła (4,110 p.)
Czy " struct MyStruct" nie powinien być przypadkiem przed mainem?
komentarz 1 lutego 2018 przez jpacanowski VIP (101,940 p.)
A czy widzisz po main() ??
komentarz 1 lutego 2018 przez hhh Gaduła (4,110 p.)
Na szybko sprawdziłem czy kod się kompiluje,  po przeniesieniu przed main zaczęło działać.
0 głosów
odpowiedź 1 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Tak jak wspomniał adrian17, typ musi być kompletny przed deklaracją obiektu tego typu. Wyjątkowe są zaś wskaźniki, które mogą wskazywać na typy niekompletne. Dlaczego niby? Wskaźnik zawsze ma ten sam rozmiar, a jedyną informacją, którą potrzebuje kompilator przy jego tworzeniu, to przynależność wskaźnika do danego typu. Pozostałe informacje, takie jak rozmiar czy zawartość typu, nie są już mu potrzebne.
komentarz 1 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
... i referencje :-)
komentarz 1 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
No nie bardzo. Referencję trzeba zapełnić już przy jej tworzeniu, więc tak czy siak musimy mieć zdefiniowany typ.
komentarz 1 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
A bardzo. Bo pisałeś o "kompletności typu". Argument referencji w deklaracji metod w klasach czy funkcji, nie wymaga znajomosci definicji typu. I także nie jest potrzebne wykonanie sizeof(..) na tym typie by alokować przestrzenie pamięciowe do niezbędnego definiowania funkcji czy zakresu atrybutów klasy.
komentarz 2 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)

A bardzo. Bo pisałeś o "kompletności typu". Argument referencji w deklaracji metod w klasach czy funkcji, nie wymaga znajomosci definicji typu.

Owszem, ale technicznie rzecz biorąc parametry funkcji są tworzone dopiero przy jej wywoływaniu, więc nie można tego porównać do tworzenia wskaźnika, np. w mainie, gdyż wskaźnik istnieje, referencja zaś nie, jest tylko abstrakcyjnym zapisem w kodzie.

 I także nie jest potrzebne wykonanie sizeof(..) na tym typie by alokować przestrzenie pamięciowe do niezbędnego definiowania funkcji czy zakresu atrybutów klasy.

Tego w ogóle nie rozumiem. 

komentarz 2 lutego 2018 przez mokrowski Mędrzec (155,460 p.)

Jeśli mówimy o "kompletności typu" (bo o nim pisałeś - popatrz do swojego postu), to referencja ma takie same działanie jak wskaźnik :-) Nie chcę tu robić jakiegoś "smrodku edukacyjnego" bo są z całą pewnością osoby bardziej kompetentne.

W uproszczeniu kompletność typu jest równoważna z możliwością wykonania na obiekcie tego typu sizeof.

Tak jak wskaźnik, tak i referencja obsługuje polimorfizm. Tak wskaźnik jak i referencja może być ustawiona na ... bzdurę. Z całą pewnością dla referencji nie jest to tak łatwe jak dla wskaźnika. Ale "jak ktoś coś brał" to... się da :-/

#include <iostream>

class Incomplete;

int main() {
    // Za takie coś bym zabijał... 
    Incomplete * incomplete;
    Incomplete& incompleteRef = *incomplete;
}

 

komentarz 2 lutego 2018 przez Patrycjerz Mędrzec (192,320 p.)
Sądziłem, że unikamy tematu UB, no ale jeśli nie, to rzeczywiście do referencji nie trzeba mieć kompletnego typu.

Podobne pytania

+1 głos
1 odpowiedź 1,075 wizyt
pytanie zadane 9 lipca 2015 w Offtop przez rafal.budzis Szeryf (85,260 p.)
+1 głos
1 odpowiedź 291 wizyt
0 głosów
1 odpowiedź 299 wizyt
pytanie zadane 29 sierpnia 2017 w Systemy operacyjne, programy przez TheKukuna Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...