Struktura przechowująca rózne typy danych
Ostatnio zmodyfikowano 2016-12-23 12:25
mimotego Temat założony przez niniejszego użytkownika |
Struktura przechowująca rózne typy danych » 2016-12-21 21:20:03 Cześć,
Zastanawiam się jak przechować dane różnego typu. Chodzi o to, że chciałbym wprowadzić jakiś ciąg (niech to będzie przykładowo równanie) tylko nie bardzo wiem jak go przechować w pamięci. Na chwilę obecną do głowy przychodzi mi lista, w której będę przechowywał dane, ale może jest może na to jakiś lepszy sposób? |
|
pekfos |
» 2016-12-21 21:27:48 Równanie możesz przechowywać jako drzewo składniowe. Zastanawiam się jak przechować dane różnego typu. |
Nie dostaniesz lepszej odpowiedzi niż "w różny sposób". Tu trzeba konkretnego przypadku. |
|
michal11 |
» 2016-12-21 22:54:07 Do przechowywania danych różnych typów stosuje się unie lub std::variant ew. jakąś własną klasę i dziedziczenie. Ale skoro ty chcesz wczytywać równanie to nie wiem jakie typy chcesz trzymać w zmiennej, ja bym wczytał to jako string i robił dalej to co chcesz. |
|
mimotego Temat założony przez niniejszego użytkownika |
» 2016-12-23 08:51:07 Wyżej zostały wspomniane unie. Załóżmy, że stworzyłbym takową przechowującą typy char i int. Czy istnieje jakiś sposób na sprawdzenie, który z typów był ostatnio używany? |
|
michal11 |
» 2016-12-23 10:20:25 Nie, ale możesz to stosunkowo łatwo sam napisać, lub skorzystać z std::variant (lub z boostowego odpowiednika). enum class MultivalueType { INT, CHAR };
struct Multivalue { union { int AsInt; char AsChar; }; MultivalueType LastSavedType; Multivalue & operator =( const Multivalue & m ); Multivalue & operator =( const int & value ); Multivalue & operator =( const char & value ); };
Multivalue & operator =( const int & value ) { AsInt = value; LastSavedType = MultivalueType::INT; return * this; } Multivalue & operator =( const char & value ) { AsChar = value; LastSavedType = MultivalueType::CHAR; return * this; }
jakiś taki prosty przykład pisany z palca, oczywiście trzeba też zadbać o to aby nie można było zmieniać wartości pól struktury pojedynczo tylko zawsze parami itd. ale wtedy dojdziemy właśnie stworzymy de facto variant. |
|
mokrowski |
» 2016-12-23 10:20:36 Przy zastosowaniu samej unii nie. Unia nie wie co w danym momencie przechowuje. Możesz jednak dodać znacznik (np. pole enum) które przechowa informację co w danym momencie trzymasz.
PS. O już kolega mnie wyprzedził :-) Tylko tego enum'a bym wrzucił do samej klasy aby się nie pętał i nie zanieczyszczał przestrzeni nazw i poprawił błędy... |
|
michal11 |
» 2016-12-23 10:46:53 Enum jest poza strukturą aby zminimalizować jej rozmiar, w zasadzie także wszystkie funkcje powinny być poza nią, jako wolne funkcje w jakiejś przestrzeni nazw. |
|
j23 |
» 2016-12-23 11:16:49 Definicja typu wyliczeniowego wewnątrz klasy nie ma wpływu na jej wielkość (już nie wspominając o metodach). |
|
« 1 » 2 |