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

Struktura przechowująca rózne typy danych

Ostatnio zmodyfikowano 2016-12-23 12:25
Autor Wiadomość
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?
P-155267
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.
P-155268
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.
P-155270
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?
P-155315
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).

C/C++
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.
P-155316
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...
P-155317
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.
P-155319
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).
P-155320
« 1 » 2
  Strona 1 z 2 Następna strona