Jedna zmienna wiele typów

0

Witam.
Tak dla treningu postanowiłem napisać sobie prosty kawałek kodu. Mianowicie jedna zmienna dajmy na to A jest wielu typów, czyli int, float, string, char. Pomyślałem, że dobrym rozwiązaniem byłoby użycie 'variants' bo gdzieś o tym przeczytałem, a nie wiem za wiele na ten temat. I tu nasuwa się moja prośba. Czy może mi ktoś to jakoś wytłumaczyć lub pomóc zrozumieć. Za każdą pomoc dziękuje.

Pozdrawiam,
Etho

0

Na razie nie mam pomysłu jak to zrobić. Ale zastanawiałem się czy jest możliwość, że wpisując z klawiatury obojętnie co będzie to przyjmował ? Tzn jak wpisze z palca 6 to jest int, jak wpisze 5.5 to float, a jak 'ala' to zwykły string. Jeśli można tak zrobić to jak to uczynić ? Proszę o jakieś wskazówki.

0

No to zobacz linka co ci wysłałem unia to taki jakby rodzaj struktury który w przeciwieństwie do struktury przechowuje jedna wartość jednego tupu który był zadeklarowany w niej. Nie możesz w niej dawać stringów bo ma dynamicznie rozszerzana pamięć. Możesz zadeklarować wszelkie inty, flouty czy tablice i będzie to widoczne pod jedna nazwą a w jednej chwili może być przechowywana tylko jedna wartość więc jest to o co tobie chodzi a przynajmniej tak myśle.

0

próbuj konwertować wczytanego stringa na poszczególne typy począwszy od tych zawierających najmniej informacji. Czyli np char, int, float, string etc. Jeśli dana konwersja się powiedzie to poinformuj użytkownika o typie do jakiego został skonwertowany string i podaj do niego wskaźnik void*. Tak widzę rozwiązanie, ale nie widzę sensu w tym zadaniu

2

Może powiedz co chcesz osiągnąć. Bardzo prawdopodobnie że obrałeś już nie najlepszą drogę.

0

Napisałem wyżej co chce osiągnąć. Po prostu jedna zmienna ma mieć wiele typów. Nie wiem już jak to inaczej mam napisać. Po prostu jak w konsoli wyskoczy komunikat, że wpisz co chcesz. To jedna zmienna będzie robić za wszystko. Wpisze 'ala' to pojawi się na ekranie 'ala'. Jak wpisze 5.6 to pojawi się 5.6. Inaczej już nie mogę tego napisać.

Wymyśliłem coś takiego.
[code]
class Liczba
{
public:
union
{
int i;
float f;
string* s;
}
};

Liczba& operator = (int var);
{
a.i = var;
return* this;
}
...

int getInt();
{
return a.i;
}
[/code]

No ale coś nie za bardzo działa.

0

Wpisze 'ala' to pojawi się na ekranie 'ala'. Jak wpisze 5.6 to pojawi się 5.6. Inaczej już nie mogę tego napisać.

Może po prostu użyj string ;)? Napis 5.6 też zostanie wyświetlony jako 5.6.

1

Wymyśliłem coś takiego.

taaak. tyyyy.
Działa bo sprawdzałem. Możliwe tylko, że ty nie umiesz z tego korzystać

btw. wykasowałeś kawałek a; przy końcu bloku unii i wszystko pojebałeś

union
   {
      int i;
      float f;
      string* s;
   }a;

wywal ten nawias co linijkę dalej

btw2. wywal średniki przy przeciążeniach operatorów i metodach
wybacz, że spytam, ale czy ty jesteś jakiś upośledzony czy coś, że nawet kodu nie umiesz skopiować i sprawdzić czy działa?

1

unii mogą być bezimenne:

class Liczba
{
public:
   union
   {
      int i;
      float f;
      string *s;
   };
};
Liczba L;
L.i=4;
L.f=2.2;
0

@Sopelek
Wybacz jeśli zostałeś urażony moim brakiem kompetencji ale próbuje to zrozumieć, a nie samo kopiuj wklej. Co mi przyjedzie po tym jak to zrobię? Jedno wielkie g**no.

Co do samego sedna tematu to wszystko działa. Ale moim zamierzeniem było wpisywanie w konsoli wartości, a nie na 'sztywno' jak jest to uczynione w obu przypadkach. Bo teraz jak odpalam to wyskakuje mi to co jest przypisane do każdego operatora. No i wszystko super. Ale dalej nie jest to tak jak ja chciałem.

1

stwóz sobie osobną klasę umieść w niej wskaźnik na voida oraz zmienną typu string określającą co w danej chwili tkwi w obiekcie. Przeładuj dla tej klasy operatory przypisania i ustaw w środku tej funkcji zmienną pomocniczą określająca co w danej chwili tkwi w obiekcie(oczywiście w zależności co przypisywaliśmy) Zaalokuj dynamicznie pamięć dla danego obiektu. Teraz jak będziesz chciał interpretować to na co pokazuje void to posłużysz się właśnie tą zmienną pomocniczą określająca co w danej chwili tkwi w obiekcie i po sprawie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1