• 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?

+2 głosów
123 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez diablol Nałogowiec (26,280 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 VIP (133,460 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 VIP (128,360 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 VIP (133,460 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 Maniak (71,280 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 297 wizyt
pytanie zadane 16 kwietnia 2015 w HTML i CSS przez Damianexo Obywatel (1,730 p.)
0 głosów
1 odpowiedź 76 wizyt
+2 głosów
1 odpowiedź 115 wizyt
pytanie zadane 19 lutego w C i C++ przez Treners Początkujący (310 p.)
Oferty pracy dla początkujących programistów na portalu No Fluff Jobs
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

49,782 zapytań

91,750 odpowiedzi

185,344 komentarzy

24,230 pasjonatów

Przeglądających: 229
Pasjonatów: 12 Gości: 217

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.

...