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

class State *current - Co to robi?

Object Storage Arubacloud
+2 głosów
206 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez Patryk Krajewski Nałogowiec (26,170 p.)

Witam,

Próbuje zaimplementować wzorzec state i znalazłem coś takiego: https://sourcemaking.com/design_patterns/state/cpp/1 ale nie wiem co oznacza linijka:

class State *current;

Zastępuje ona forward declaration i tworzy wskaźnik na klasę czy co? Co jeśli chciałbym wywołać funkcję na rzecz tego wskaźnika czyli current->funkcja(), bo raczej w klasie Machine składniki klasy state nie są jeszcze znane?

 

3 odpowiedzi

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

Zastępuje ona forward declaration i tworzy wskaźnik na klasę czy co? 

Dokładnie. Pierwszy raz coś takiego widze i nie moge znaleźć żadnego info na ten temat w internecie, ale kompiluje się i faktycznie działa tak jakby poza utworzeniem obiektu zastępowało forward declaration (polska nazwa brzmiała by dziwnie :D). 

komentarz 17 lutego 2017 przez Ehlert Ekspert (212,670 p.)

Nie działa to na takiej samej zasadzie jak używanie słowa struct w C przed zadeklarowaniem instancji?

 /* deklaracja */
 struct miasto
 {
     long ludnosc;
     char* rzeka;
 };

 /* definicja */
 struct miasto Poznan;
 Poznan.ludnosc = 550000;

Source

komentarz 17 lutego 2017 przez criss Mędrzec (172,590 p.)
edycja 17 lutego 2017 przez criss

Być może ma to też jakieś podłoże w zgodności z C (tzn. analogiczne zachowanie dla słowa struct - wiadomo, że w C nie ma class, więc nie można mówić o żadnej zgodności :P), ale opisałem jak to wygląda z tego, co sprawdziłem.

Dla przykładu:

To się nie kompiluje (co raczej dziwne nie jest):

class A { B *b; };
class B { };

Ale to już tak:

class A { class B *b; };
class B { };

 

+1 głos
odpowiedź 17 lutego 2017 przez mokrowski Mędrzec (155,460 p.)

Nazwy struct/union/clas, rezydują w 1 przestrzeni nazewniczej. Jeśli posiadasz nazwę np. typu float która jest taka sama jak np. klasa, kompilator nie będzie wiedział o którą Ci chodzi bo domyślnie przeszukuje najpierw nazw (upraszczając aby nie cytować standardu) lokalnych i "znanych z języka C" do pierwszego trafienia. Wtedy podaje się specyfikację rodzaju struktury (czyli enum/struct/class).

To jest tak jak w C jeśli definiowało się np. strukturę bez związania jej z aliasem typu (przez typedef), to trzeba było powtórzyć słowo struct. Obowiązywało to także dla union i enum a w C++ doszło jeszcze class :-)

Tu masz błędny program:

#include <iostream>

struct X {
    void show() {
        std::cout << "struktura X\n";
    }
};

class X {
    void show() {
        std::cout << "klasa X\n";
    }
};

union X {
    void show() {
        std::cout << "unia X\n";
    }
};

int main() {
    int X;
    X x;
    x.show();
}

1 błąd programu to brak jednoznaczności czym ma być X. Czy to unia, klasa czy struktura. Kompilator zgłosi błąd redefinicji X. Jeśli zdecyduję się np. na unię i usunę klasę i struct, pojawi się następny błąd. W linijce:

X x;

.. kompilator twierdzi że już zna X bo  jest to int. No to dodam przed X słowo union i po sprawie :-) I właśnie o tę deklarację ang. Elaborated type specifier chodzi. Po poprawkach:

#include <iostream>

union X {
    void show() {
        std::cout << "unia X\n";
    }
};

int main() {
    int X;
    union X x;
    x.show();
}

Teraz pozostanie jedynie ostrzeżenie o nieużywaniu zmiennej o nazwie X.

Podobne pytania

0 głosów
4 odpowiedzi 721 wizyt
pytanie zadane 16 kwietnia 2015 w HTML i CSS przez Damianexo Obywatel (1,710 p.)
0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 22 lutego 2018 w PHP przez Daniel90 Pasjonat (17,970 p.)
+2 głosów
1 odpowiedź 385 wizyt
pytanie zadane 19 lutego 2018 w C i C++ przez Treners Początkujący (310 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...