[C++] Zmienna zawierająca typ zmiennych

0

W jaki sposob moge zrobic zmienna do typu zmiennych. Glupio to brzmi, ale trudno wytlumaczyc

na przyklad aby cos takiego napisac

if (wybor=="int") typ=settype(int);
typ *zmienna=new typ;

typdefem nie moge tego zrobic bo ma zasieg lokalny i po wyjsciu ze switcha/ifa jego dzialanie sie konczy

a pisanie tego samego kodu dla 5 roznych zmiennych nie jest zbyt ciekawe

0

Jesli musialbys napsac 5 razy kod dla roznych typow zmiennych, to w C++ przeciez od tego sa wzorce!
Moze nauczenie sie tego nie jest zbyt szybkie, ale pozwala pisac naprawde elegancki i zwarty kod. Zeby sprawdzac, czy typ zmiennej jest np. int mozesz uzyc konstrukcji:

if (*typeid(zmienna) == *typeid(int))
...

To jest oczywiscie bardzo rzadko potrzebne (nie widzialem jeszcze uzasadnionego uzycia). Ale jesli i to nie wystarcza, to w sytuacjach naprawde beznadziejnych mozna sie posluzyc definicjami parametryzowanymi preprocesora.

Jeszcze jedno: nie wiem dokladnie po co Ci to, ale byc moze nawet wzorce nie beda potrzebne.

Mozesz zrobic klase bazowa dla wszystkich typow, ktore w ten sposob chcesz sprawdzac (wtedy wbudowane oczywiscie odpadaja). Pozniej mozesz sprawdzac za pomoca dynamic_cast<> jakiego typu jest zmienna (zwroci 0, jesli zle rzutujesz lub zrzuci wyjatek bad_cast).

0

....
[CIACH!]

if (*typeid(zmienna) == *typeid(int))

[CIACH!]
....

to wszystko wiem
ale chodzi mi o to ze ja nie mam tej zmiennej, to uzytkownik w czasie dzialania programu wybiera zmienna

glownie chodzi mi o cos w stylu

if (wybor=="int") typedef int typ;
typ *zmienna=new typ;

tylko ze zasieg tego typ jest tylko w "ifie" i nie moge uzyc jego pozanim

a co do tego drugie pomyslu to pomysle bo moze sie cos uda

0

W c sie nie da ale w c++ tak za pomoca przeciazania :)

0

glownie chodzi mi o cos w stylu

if (wybor=="int") typedef int typ;
typ *zmienna=new typ;

Powtórzę sie... Nie da rady... 'typedef' jest interpretowane tylko i wyłacznie w czasie kompilacji, jest praktycznie dyrektywą kompilatora. Natomiast 'if' jest instrukcją czasu działania, wynikiem kompilacji.

// Napisz interpreter c++ wtedy może będziesz mógł to zrobić.

0

nie wiem czy do końca o to ci chodzi, pomyśl o szblonach
przykładowo piszesz sobie funkcję, w specjalny sposób, i teraz jak użytkownik wybierze double to funkcja sie wywoła jak dla doubla, jak int to jak dla inta.

0

croolik, mi nie chodzilo o taki zapis, ale w c++ jakby nie bylo mozna latwo zrealizowac wykrywanie typu zmiennych...

// Nie chce dawać nowego postu, wiec rozwinę myśl cepy o przeciążaniu [mf]

np.

#define chartype 1
#define inttype 2
#define voidptrtype 3

int gettype(char& zmienna){
  return 1; // return chartype;
}

int gettype(int& zmienna){
  return 2; // return inttype;
}

int gettype(void*& zmienna){
  return 3; // return voidptrtype;
}

Ale to dotyczy tylko i wyłącznie zadeklarowanych zmiennych, dalej podtrzymuję zdanie, że podczas działania programu nie da sie zmienić deklaracji typu.

0

c/c++ to nie jest język skryptowy - nie możesz myśleć o nim jak o PHP. Typy zmiennych deklarujesz (jak powiedzieli przedmówcy) na etapie kompilacji a nie działania programu. Wsio.

0

Jak powiedzieli koledzy, normalnie się nie da (bo to by było po prostu bez sensu).
Ale chciałbym podkreślić to, co już napisał wyżej flabra:

Napisz interpreter c++ wtedy może będziesz mógł to zrobić.
(a po tym o co pytasz i tak wnioskuje, że robisz coś w tym stylu).

I ja bym tu się zastanawiał nad użyciem unii (struktury z zerowym przesunięciem [deltą] każdego pola względem początku struktury [czyli pola zaczynają się w tym samym miejscu pamięci, nachodzą na siebie]), albo ustaliłbym, że zmienną interpretuję jako tablicę char i wszystkie operacje wykonuję na niej.

PS> Może to co napisałem jest deczko niejasne, ale... chciałem dobrze;) :p

0

Zmienianie typu zmiennej w trakcie pracy nie jest mozliwe, bo po pierwsze trudno byloby to zrealizowac w praktyce (w jezyku kompilowanym chyba nie jest to mozliwe, jak napisal Flabra), po drugie NIE JEST TO NIKOMU POTRZEBNE.

Typy zmiennych i ich restrykcyjne sprawdzanie sa po to, zeby zwiekszyc czytelnosc programow i wylapac wiele bledow na etapie kompilacji. Tak jest nawet w Javie, mimo ze jest tylko pseudo-kompilowana. A PHP tego nie ma i dlatego sie nie nadaje do powaznych projektow. W ogole PHP to nie jest jezyk programowania, tylko robotki skryptowe. Jak zaczynasz programowac w C/C++/Java/Basic/Pascal to radze Ci: zapomnij o PHP, bo bedziesz miec klopoty.

Z dyskusji wnioskuje, ze prawdopodobnie w Twoim wypadku nalezy zastosowac polimorfizm czasu wykonania (czyli dziedziczenie + wirtualki), ewentulanie dynamiczne rzutowanie, ale nie opisales dokladnie o co Ci chodzi. Zmienic typu zmiennej sie nie da. Mozna dowiedziec sie jedynie jakiego jest typu i/lub zrzutowac ja na inny typ.

0

Jak zaczynasz programowac w C/C++/Java/Basic/Pascal to radze Ci: zapomnij o PHP, bo bedziesz miec klopoty.

w sumie to w php najpozniej zaczalem programowac

mi glownie chodzilo o te zmiane, ale jak mowil flabra pewnie sie w ten sposob nie da

0

Własciwie da sie coś zrobic... Ale tylko jako kompilację warunkową... np.

#if defined (_WINDOWS_)
typedef int typ;
#else
typedef char typ;
#endif

// lub 

#ifdef _WINDOWS_
typedef int typ;
#else
typedef char typ;
#endif

// to rownież są tylko dyrektywy kompilatora

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