• 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
121 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez diablol Nałogowiec (25,600 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 (129,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 2017 przez Ehlert VIP (120,000 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 (129,880 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 (52,260 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 274 wizyt
pytanie zadane 16 kwietnia 2015 w HTML i CSS przez Damianexo Obywatel (1,730 p.)
0 głosów
1 odpowiedź 68 wizyt
+2 głosów
1 odpowiedź 101 wizyt
pytanie zadane 5 dni temu w C i C++ przez Treners Początkujący (290 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.
Ciekawy innych porad? Odwiedź tę stronę!

45,846 zapytań

86,310 odpowiedzi

172,556 komentarzy

22,276 pasjonatów

Przeglądających: 233
Pasjonatów: 18 Gości: 215

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.

...