Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Enumerable i wartość jako inny typ.

Ostatnio zmodyfikowano 2014-08-16 11:58
Autor Wiadomość
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.
P-115445
Jacob99
» 2014-08-14 15:33:06
A mógłbyś łaskawie podać logi kompilacji?
P-115449
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.
P-115451
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?
P-115452
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.
P-115454
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.
P-115455
Monika90
» 2014-08-14 16:08:38
może coś takiego:
C/C++
//w nagłówku
struct ServerPacketType
{
    ServerPacketType( DataType * description )
        : description( description )
    { }
    std::unique_ptr < DataType[] > description;
};

extern const ServerPacketType handshake;
extern const ServerPacketType goodbye;
//etc

C/C++
//w pliku *.cpp
const ServerPacketType handshake { new DataType[ 2 ] { Bool, Int } };
const ServerPacketType goodbye { new DataType[ 1 ] { Bool } };
jeżeli dobrze rozumiem o co Ci chodzi...
P-115457
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ę?
P-115551
« 1 » 2
  Strona 1 z 2 Następna strona