Zamiana std::string na enum.

0

Cześć ;)
Mam 2 klasy: Engine i Player. W klasie Player mam enum(prywatne), które mówi w jakim "stanie" jest postać:

enum Status {
	IDZ,
	STOJ,
	BIEG
	}; 

Chcę zmienić wartość tego enum na przykładowe IDZ. Próbowałem napisać funkcję z poziomu klasy Engine:

player.status_change("IDZ");

A w samej klasie Player:

**Player.h**
void status_change(std::string stat);

**Player.cpp**
void Player::status_change(std::string stat)
{
    status=(Status)stat;
}
 

Wyświetlił mi się błąd kompilacji: error: invalid cast from type 'std::string {aka std::basic_string<char>}' to type 'Player::Status'

Przeczytałem, że stringa nie da się bezpośrednio zamienić na enum. Znalazłem tutaj jakieś rozwiązanie(C#, ale bym spróbował napisać w C++ ): http://www.cezarywalenciuk.pl/post/2011/11/22/String-i-enum-C-konwersja-string-na-enum.aspx

Ale czy nie da się tego zrobić w jakiś prostszy sposób?

1

Mapa, macro (boost preprocessor) albo switch.

0

Dzięki wielkie za odpowiedź (o mapach nie słyszałem) ;) A czy wiesz może, które rozwiązanie będzie najszybsze? Bo dość często ta zamiana będzie się wykonywała.

1

Dlaczego to konieczne chcesz ustawiać stringiem ? Nie możesz po prostu użyć: Status::IDZ ?

1

Zamiana stringa na enuma zawsze będzie wolna w porównaniu do zwykłego skopiowania wartości. Zminimalizuj liczbę konwersji to nie będziesz musiał się przejmować ich wydajnością.

1

Bo dość często ta zamiana będzie się wykonywała.

Milion razy na sekundę, za każdym razem dla innego stringa?
Bo jeśli dwadzieścia razy na sekundę dla różnych stringów, to nie masz się czym przejmować.
A jeśli milion razy dla tego samego stringa, to you are doing it wrong.

0

Hmm.. naprawdę nie wiem po_co chcesz robić tę konwersję. No ale zakładając że masz powód, można tak:

#include <iostream>
#include <map>

using namespace std;

enum class Status : int {
    state1, state2, state3, state4
};

ostream& operator<<(ostream& out, const Status& state);

int main(void) {

    Status state = Status::state1;
    cout << state << endl;
}

ostream& operator<<(ostream& out, const Status& state) {

    using enum_map_t = map<Status, const char * const>;

    static enum_map_t statusMap {
        {Status::state1, "state first"},
        {Status::state2, "state second"},
        {Status::state3, "state thrid"}
    };

    return out << statusMap[state];
}
0

Wykonuje się około 60 razy na sekundę. Ale dla tego chciałem stringiem, bo w Engine.h gdy użyłem

 player.status=IDZ;

wyświetliło mi komunikat: error: 'IDZ' was not declared in this scope.
Próbowałem wpisać:

player.status=(player.Status)IDZ;

i inne kombinacje (np. Player::Status - metoda prób i błędów) ale nie mam pojęcia jak mogę to zmienić. Mógłby mnie ktoś naprowadzić w jaki sposób mogę to zrobić?

1
Mixon1212 napisał(a):

(...) Ale dla tego chciałem stringiem, bo w Engine.h gdy użyłem

 player.status=IDZ;

wyświetliło mi komunikat: error: 'IDZ' was not declared in this scope.

Mixon1212 napisał(a):

Cześć ;)
Mam 2 klasy: Engine i Player. W klasie Player mam enum(prywatne), które mówi w jakim "stanie" jest postać:

enum Status {
	IDZ,
	STOJ,
	BIEG
	}; 

(...)

= nie masz dostępu do prywatnego typu klasy Player poza klasą Player i typami/funkcjami z nią zaprzyjaźnionymi.
Przenieść tego enuma do osobnego pliku i najlepiej zdefiniuj go jako scoped enum.

1 użytkowników online, w tym zalogowanych: 0, gości: 1