2016-03-11 13 views
6

zrobiłem enum jako:klasy enum jako indeks tablicy

enum class KeyPressSurfaces { 
    KEY_PRESS_SURFACE_DEFAULT, 
    KEY_PRESS_SURFACE_UP, 
    KEY_PRESS_SURFACE_DOWN, 
    KEY_PRESS_SURFACE_LEFT, 
    KEY_PRESS_SURFACE_RIGHT, 
    KEY_PRESS_SURFACE_TOTAL 
}; 

a później próbuję zdefiniować tablicę jako Wpisałem poniżej, ale dostałem błąd, size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'

SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL]; 

I rozumiem błąd w porządku, ale nie wiem, gdzie przenieść KeyPressSurfaces, aby zakwalifikować stałą w wyliczeniu.

Również zdaję sobie sprawę, że mogę po prostu użyć enum, a nie enum class, ale mam wrażenie, że to powinno działać, i chcę się nauczyć, jak to zrobić.

Każda odpowiedź/porada jest doceniana! Dzięki!

+0

Dlaczego tak bardzo chcesz użyć wyliczenia do określenia rozmiaru tablicy? Rozmiar powinien być stałą czasu kompilacji. – user463035818

+2

Wyliczenie jest stałą czasową kompilacji. – parsley72

Odpowiedz

9

Zakres() nie jest domyślnie wymienialny na liczby całkowite. Trzeba użyć static_cast:

SDL_Surface*KEY_PRESS_SURFACES[static_cast<int>(KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL)]; 
1

Usuń słowo kluczowe lub rzuć bezpośrednio na typ integralny.

7

można przekonwertować enum do int użyciu funkcji szablonu, a otrzymasz kod bardziej czytelny:

#include <iostream> 
#include <string> 
#include <typeinfo> 

using namespace std; 

enum class KeyPressSurfaces: int { 
    KEY_PRESS_SURFACE_DEFAULT, 
    KEY_PRESS_SURFACE_UP, 
    KEY_PRESS_SURFACE_DOWN, 
    KEY_PRESS_SURFACE_LEFT, 
    KEY_PRESS_SURFACE_RIGHT, 
    KEY_PRESS_SURFACE_TOTAL 
}; 

template <typename E> 
constexpr typename std::underlying_type<E>::type to_underlying(E e) { 
    return static_cast<typename std::underlying_type<E>::type>(e); 
} 


int main() { 
    KeyPressSurfaces val = KeyPressSurfaces::KEY_PRESS_SURFACE_UP; 
    int valInt = to_underlying(val); 
    std::cout << valInt << std::endl; 
    return 0; 
} 

I Fount to_underlying funkcja here

-2

Alternatywnie ci można zamienić swój array na map, co oznacza również, że można się pozbyć KEY_PRESS_SURFACE_TOTAL:

enum class KeyPressSurfaces { 
    KEY_PRESS_SURFACE_DEFAULT, 
    KEY_PRESS_SURFACE_UP, 
    KEY_PRESS_SURFACE_DOWN, 
    KEY_PRESS_SURFACE_LEFT, 
    KEY_PRESS_SURFACE_RIGHT 
}; 

std::map<KeyPressSurfaces, SDL_Surface*> KEY_PRESS_SURFACES; 
+0

To nie jest ogólne rozwiązanie problemu, ponieważ std :: map będzie wolniejszy niż przy użyciu tablicy. –

+0

"Przedwczesna optymalizacja jest źródłem wszelkiego zła." - w pytaniu nie ma nic, co sugeruje, że prędkość jest problemem, kompilator może być na tyle sprytny, aby sobie z tym poradzić i uważam to za czystsze rozwiązanie. – parsley72

+0

Jestem prawie pewien, że żaden kompilator (przeszłość, teraźniejszość lub przyszłość) nie zamieni std :: map w tablicę. Istnieje również różnica między pisaniem powolnego kodu, ponieważ nie chcesz optymalizować przedwcześnie i pisać powolny kod, ponieważ nie masz pojęcia, że ​​konstrukt, którego używasz, jest powolny. Zdarzyło mi się, że sam pisałem program (silnik szachowy), w którym wydajność uderzająca w użycie std :: map byłaby całkowicie brutalna. –