• 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
114 wizyt
pytanie zadane 16 lutego w C i C++ przez diablol Pasjonat (23,720 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

+1 głos
odpowiedź 16 lutego przez Criss VIP (111,880 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 przez Ehlert Szeryf (96,410 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 przez Criss VIP (111,880 p.)
edycja 17 lutego 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 przez mokrowski Nałogowiec (29,980 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 238 wizyt
pytanie zadane 16 kwietnia 2015 w HTML i CSS przez Damianexo Obywatel (1,730 p.)
+1 głos
1 odpowiedź 68 wizyt

37,287 zapytań

74,451 odpowiedzi

144,335 komentarzy

17,254 pasjonatów

Przeglądających: 273
Pasjonatów: 32 Gości: 241

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.

...