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 |