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

question-closed Obiekt typu wyliczeniowego znajdującego się w klasie A jako argument funkcji z klasy B.

Object Storage Arubacloud
0 głosów
216 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez Damian11131 Stary wyjadacz (13,490 p.)
zamknięte 6 sierpnia 2016 przez Damian11131

Cześć to znowu ja. Dzisiaj natknąłem się na pewien problem związany z przekazywaniem obiektu typu wyliczeniowego do funkcji pewnej klasy, oto kod:

//GameManager.hpp
enum PlayerMovementDirection
{
	LEFT,
	RIGHT,
	JUMP,
	ARE_NOT_MOVING
};
//...oraz stworzony obiekt tegoż typu, na razie niezainicjalizowany
PlayerMovementDirection playerMovementDirection;
//Player.hpp
//W tym pliku mam funkcję move o następującej deklaracji:
void move(const PlayerMovementDirection direction, const float FPS);
//a wywołuję ją tak:
player.move(playerMovementDirection, FPS);

Błędy są następujące:

Player.hpp:30:18: error: ‘PlayerMovementDirection’ does not name a type
  void move(const PlayerMovementDirection direction, const float FPS);
                  ^
In file included from GameManager.hpp:9:0,
                 from main.cpp:1:
Player.hpp:30:18: error: ‘PlayerMovementDirection’ does not name a type
  void move(const PlayerMovementDirection direction, const float FPS);
                  ^
In file included from Player.cpp:1:0:
Player.hpp:30:18: error: ‘PlayerMovementDirection’ does not name a type
  void move(const PlayerMovementDirection direction, const float FPS);
                  ^
Player.cpp:21:25: error: ‘PlayerMovementDirection’ does not name a type
 void Player::move(const PlayerMovementDirection direction, const float FPS)

Zadeklarowanie klasy GameManager na początku pliku Player.hpp nie pomogło, jak i również używanie przedrostka GameManager, np. tak: 

void move(const GameManager::PlayerMovementDirection direction, const float FPS);

Proszę o pomoc.

komentarz zamknięcia: Problem rozwiązany.

4 odpowiedzi

+1 głos
odpowiedź 5 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 6 sierpnia 2016 przez Damian11131
 
Najlepsza

Po kolei.. Po pierwsze.. Dlaczego przesyłasz enum'a jako argument funkcji? Przez tego const mogę się domyślać, że po prostu pomieszało ci się trochę czym dokładnie jest enum. Po prostu wsadź ten kod:
enum PlayerMovementDirection
{
    LEFT,
    RIGHT,
    JUMP,
    ARE_NOT_MOVING
};

Do jakiegoś osobnego pliku nagłówkowego (np. Keys.h) i dołączaj go do każdego pliku (.cpp), w którym będzie ci potrzebny ten enum (nie musisz nigdzie tworzyć obiektu typu PlayerMovementDirection). Teraz jeżeli chcesz wykorzystać jedną z tych (stałych) wartości wystarczy, że zrobisz np. tak:
Player.Move(PlayerMovementDirection::LEFT);
//Gdzie argumentem w metodzie Move jest zwykły int

Jeżeli jednak koniecznie chcesz przesyłać enum.. to poczytaj o czymś takim jak "enum class".. jak wygooglujesz znajdziesz na pewno.
Przykład użycia enum class:
http://cpp.sh/93mhv

komentarz 6 sierpnia 2016 przez Damian11131 Stary wyjadacz (13,490 p.)
Bardzo dziękuję, umieszczenie enum'a w osobnym pliku pomogło.
+1 głos
odpowiedź 5 sierpnia 2016 przez Dubgron Mądrala (5,620 p.)

Program nie działa, ponieważ w deklaracji metody chcesz pobrać stały obiekt, a przesyłasz mu zmienny. Żeby to naprawić usuń const z deklaracji funkcji lub dodaj &. Wtedy będziesz pobierał referencję do stałego obiektu i przesłanie zwykłego powinno zadziałać. Całość powinna wyglądać tak

void move(PlayerMovementDirection direction, const float FPS);

lub

void move(const PlayerMovementDirection& direction, const float FPS);

Mam nadzieję, że pomogłem. Pozdrawiam.

komentarz 5 sierpnia 2016 przez Damian11131 Stary wyjadacz (13,490 p.)
Nie pomogło, teraz mam błędy typu

Player.hpp:30:12: error: ‘PlayerMovementDirection’ has not been declared
  void move(PlayerMovementDirection direction, const float FPS);
komentarz 5 sierpnia 2016 przez criss Mędrzec (172,590 p.)

@Dubgron, to tak nie działa. 

const przy argumencie w funkcji/metodzie, to deklaracja, że nie będzie on zmieniany.

komentarz 5 sierpnia 2016 przez Dubgron Mądrala (5,620 p.)
@Criss, Zgadza się, mój błąd.
+1 głos
odpowiedź 5 sierpnia 2016 przez criss Mędrzec (172,590 p.)
Samo zadeklarowanie klasy nie ma jak czegokolwiek dać, bo to tylko deklaracja. Player wciąż nie wie, że wewnątrz GameManager jest taki enum. Musisz zaincludować cały GameManager w Player.h.

Jeśli enum jest zadeklarowany wewnątrz GameManager, to musisz pisać GameManager::PlayerMovementDirection. No i oczywiście musi być public.
0 głosów
odpowiedź 5 sierpnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)

czy ten enum jest w środku jakiejś klasy?
jeśli tak to musi to byc tak:
 

void move(GameManager::PlayerMovmentDirection, float FPS);

 

Podobne pytania

0 głosów
1 odpowiedź 854 wizyt
pytanie zadane 27 kwietnia 2016 w C i C++ przez lukasz_m Obywatel (1,380 p.)
0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 31 października 2016 w C i C++ przez PaulW Początkujący (470 p.)
0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 28 października 2016 w C i C++ przez PaulW Początkujący (470 p.)

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

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

...