2016-03-11 17 views
6

tôi đã thực hiện một enum như:enum lớp như chỉ số mảng

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 
}; 

và sau này tôi cố gắng để xác định một mảng như tôi đã gõ dưới đây, nhưng tôi nhận lỗi, size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'

SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL]; 

tôi hiểu sai lỗi, nhưng tôi không biết di chuyển các số KeyPressSurfaces để đủ điều kiện cho hằng số trong enum.

Tôi cũng nhận ra rằng tôi chỉ có thể sử dụng enum chứ không phải enum class, nhưng tôi cảm thấy điều này sẽ hiệu quả và tôi muốn tìm hiểu cách thực hiện việc này.

Bất kỳ phản hồi/lời khuyên nào được đánh giá cao! Cảm ơn!

+0

tại sao bạn muốn sử dụng enum để chỉ định kích thước của mảng? Kích thước phải là một hằng số thời gian biên dịch. – user463035818

+2

Enum là hằng số thời gian biên dịch. – parsley72

Trả lời

9

Phạm vi enum s (enum class) không được chuyển đổi hoàn toàn thành số nguyên. Bạn cần phải sử dụng một static_cast:

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

Xóa từ khóa class hoặc truyền rõ ràng thành loại tích phân.

7

Bạn có thể chuyển đổi của bạn enum để int sử dụng mẫu chức năng và bạn sẽ nhận được mã dễ đọc hơn:

#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; 
} 

Tôi fount to_underlying chức năng here

-2

Hoặc bạn có thể thay thế array của bạn bằng map, điều này cũng có nghĩa là bạn có thể loại bỏ 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

Đây không phải là giải pháp chung cho vấn đề, vì std :: map sẽ chậm hơn so với sử dụng mảng. –

+0

"Tối ưu hóa sớm là gốc rễ của mọi điều ác". - Không có gì trong câu hỏi cho thấy tốc độ là một vấn đề, trình biên dịch có thể đủ thông minh để xử lý điều này và tôi thấy đây là một giải pháp sạch hơn. – parsley72

+0

Tôi khá chắc chắn không có trình biên dịch (quá khứ, hiện tại hoặc tương lai) sẽ biến một std :: map thành một mảng. Ngoài ra còn có sự khác biệt giữa việc viết mã chậm vì bạn không muốn tối ưu hóa sớm và viết mã chậm vì bạn không biết cấu trúc bạn đang sử dụng chậm. Tôi tình cờ viết một chương trình ngay bây giờ (một động cơ cờ vua), nơi mà hiệu suất đạt được từ việc sử dụng std :: map sẽ hoàn toàn tàn bạo. –

Các vấn đề liên quan