An0nym8us Temat założony przez niniejszego użytkownika |
Enumerable i wartość jako inny typ. » 2014-08-14 13:52:29 Witam, mam kolejny problem. Piszę program/"grę" na podstawie protokołu serwera - ot tak dla rozrywki, satysfakcji i chęci zdobycia doświadczenia w C++. Postanowiłem, że opiszę wszystkie używane typy danych w typie wyliczeniowym: enum DataType : char { Bool = 0x01, Byte = 0x02, Short = 0x03, Int = 0x04, Long = 0x05, UUID = 0x06, Float = 0x07, Double = 0x08, String = 0x09, VarInt = 0x0A, MetaData = 0x0B, SlotData = 0x0C }; Mam w tym enumie tego o wiele więcej, m. in. tablice, typy unsigned i tablice typów unsigned - za dużo kodu. To powinno wystarczyć :). W każdym bądź razie - napisałem sobie prostą klasę, w której to znajduje się unordered_map, do którego pakuję dane typów podanych wyżej i metoda konwertująca to wszystko do char*, nadającego się wysłać do serwera. Teraz muszę napisać konwerter pakietów przychodzących. Postanowiłem, że stworzę kolejny typ enum, w którym zawrę (jako "klucz") nazwę pakietu (to, czego dotyczy) i tablicę wartości, jakie on w sobie posiada, dla przykładu: enum ServerPacketType // Serverbound packet types { HANDSHAKE = new DataType[2] {Bool, Int} } Niestety kod ten wywala mnóstwo błędów. Próbowałem użyć DataType.Bool, DataType.Int, ale nie działa. Próbowałem także enum ServerPacketType : DataType[] Także nie działa, także z wziętym DataType[] w nawiasy okrągłe. Czy w ogóle jest możliwe stworzenie enuma, którego wartości są tablicami innego enuma? Jeśli tak, to jak wygląda deklaracja owego enuma? Pozdrawiam. |
|
Jacob99 |
» 2014-08-14 15:33:06 A mógłbyś łaskawie podać logi kompilacji? |
|
michal11 |
» 2014-08-14 15:47:14 Możesz spróbować enum ServerPacketType: DataType * i później jakoś to dynamicznie alokować ale nie wydaje mi się żeby to zadziałało. |
|
An0nym8us Temat założony przez niniejszego użytkownika |
» 2014-08-14 15:51:43 A proszę bardzo, choć według mnie tutaj nie są potrzebne, bo wydaje mi się to raczej błędem laika. Logi zapodane z wielką łaskawością na pastebin.com oraz z wkładem własnym jako kodem (także podanym z wielką łaskawością ;)): http://pastebin.com/EjakcjMB
Z tego co tam wynika problem tkwi w tym że enum są tak zbudowane że nie można umieścić w ich wnętrzu operatora new/new[], zatem w jaki sposób można użyć tablicy jako wartości w enumie? |
|
Monika90 |
» 2014-08-14 15:52:19 Czy w ogóle jest możliwe stworzenie enuma, którego wartości są tablicami innego enuma? |
nie da się. Stwórz klasę lub strukturę, a następnie stałe typu tej klasy/struktury. |
|
An0nym8us Temat założony przez niniejszego użytkownika |
» 2014-08-14 15:55:58 Ok, dzięki za pomoc. Myślałem że załatwię to w ten sposób :D. Spróbuję ze strukturami, ew. pokombinuję z prostą funkcją konwertującą int na tablicę DataType, a do tego enuma podopisuję skonwertowane int :). Pozdrawiam. |
|
Monika90 |
» 2014-08-14 16:08:38 może coś takiego: struct ServerPacketType { ServerPacketType( DataType * description ) : description( description ) { } std::unique_ptr < DataType[] > description; };
extern const ServerPacketType handshake; extern const ServerPacketType goodbye;
const ServerPacketType handshake { new DataType[ 2 ] { Bool, Int } }; const ServerPacketType goodbye { new DataType[ 1 ] { Bool } };
jeżeli dobrze rozumiem o co Ci chodzi... |
|
An0nym8us Temat założony przez niniejszego użytkownika |
» 2014-08-15 23:17:50 O coś takiego mi chodziło :D. Chciałem te stałe zawrzeć w enumie żebym miał do nich łatwiejszy dostęp.
Po głębszym zastanowieniu postanowiłem, że chyba umieszczę te stałe w unordered_map. Jako klucza chciałbym użyć ID pakietu (int), wówczas z przychodzącego pakietu wyekstrahowałbym jego ID i łatwo się odniósł do jego struktury, co zapobiegłoby męczeniu się ze switch...case.
Tak poza tym, to czy w ogóle jest możliwe użycie w enumie innego typu danych niż całkowitoliczbowego? I kolejne pytanie: czy możliwa jest deklaracja i dodanie obiektów do unordered_map bezpośrednio na starcie programu, czy lepiej byłoby utworzyć główną klasę programu w której to wszystkie takowe obiekty do mapy dodaję? |
|
« 1 » 2 |