Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » typen zur laufzeit definieren (typedef)???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.10.2004, 16:17 Uhr
~c0x
Gast


hi ihr^^
ist es irgendwie möglich, typen zur laufzeit via typedef zu definieren? mir schwebt folgendes vor:

C++:
int typ = 0;
cin >> typ;
switch (typ)
{
case 1:
    typedef int x;
    break;
case 2:
    typedef char x;
    break;
case 3:
    typedef float x;
}
cout << sizeof(x);


allerdings klappt das irgendwie nicht. ich hoffe ihr habt den gedanken verstanden und habt ideen, wie man das realisieren kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.10.2004, 16:53 Uhr
ao

(Operator)


typedef geht nur zur Compilezeit.

Vielleicht kommst du mit einem Template weiter?


C++:
template <typename T>
class Type
{
public:
    T t;
};

int main (void)
{
    // Instanzierung und Typisierung zur Laufzeit
    Type<int> tint;

    // Zugriff auf das Datenfeld
    tint.t = 7;

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.10.2004, 17:09 Uhr
~c0x
Gast


ja, das ginge... dazu bräuchte ich aber noch etwas... kann ich irgendwie die möglichen werte für das template einschränken? sodass man zb nur int oder float übergeben kann?
und nochwas: wenn dieser "container" nun eine klasse enthält, müsste ich ja um an die funktionen zu kommen folgendes schreiben

C++:
container<klasse> x;
x.member.func();


kann ich das nicht irgendwie umgehen um einfach folgendes schreiben zu können?

C++:
container<klasse> x;
x.func();


dazu müsste ich doch irgendwie den operator '.' überladen, wie geht das?
und zu guter letzt^^:
wenn nun eine klasse so einen container enthält, muss ich ja schon beim schreiben der klasse den typen des containers wissen, aber was tun, wenn dieser erst zb in eine 'initialize' methode der klasse bekannt ist/wird (zb durch user eingaben oä)?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.10.2004, 20:04 Uhr
ao

(Operator)



Zitat von ~c0x:
jmuss ich ja schon beim schreiben der klasse den typen des containers wissen, aber was tun, wenn dieser erst zb in eine 'initialize' methode der klasse bekannt ist/wird (zb durch user eingaben oä)?

Stimmt, da hörts dann auch wieder auf. Was an folgendem Denkfehler liegt, den ich gemacht habe: Auch Template-Code ist kein Laufzeit-Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.10.2004, 20:16 Uhr
~c0x
Gast


hm, ich bin jetz auf unions bekommen... ich schreibe also eine wrapper klaees, die ein enum enthält, das constanten für jeden möglichen typ enthält (zb Int, Float), ein union, dass variablen des möglichen typen enthält und einen konstruktor, der ein oben beschriebene enum konstante annimmt und daraufhin den entsprechenden enum member initialisiert.
bleibt nur noch folgendes prob...:

C++:
wrapper x(x::Typ);
// um jetzt auf memberfunktionen und variablen von 'Typ' zugreifen zu können, muss ich immer noch...
x.mUnion.func();
//schreiben... ich möchte aber:
x.func();


wie mache ich das denn?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2004, 09:52 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Du mit MFC oder so kuschelst, kannst Du Dir mal CVariant anschauen...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.10.2004, 13:48 Uhr
0xdeadbeef
Gott
(Operator)


Wenn es dir um komplexe Typen geht, die ein gemeinsames Interface bieten, willst du im Zweifel eine Vererbungshierarchie mit virtuellen Funktionen aufbauen:

C++:
#include <iostream>

struct A {
  void foo() { std::cout << "A::foo" << std::endl; }
  virtual void bar() { std::cout << "A::bar" << std::endl; }
};

struct B : public A {
  void foo() { std::cout << "B::foo" << std::endl; }
  virtual void bar() { std::cout << "B::bar" << std::endl; }
};

int main() {
  A *p = new B;

  p->foo(); // gibt A::foo aus, weil foo nicht virtual und p ein A* ist
  p->bar(); // gibt B::bar aus, weil bar virtual ist und wir p eine Instanz von B zugewiesen haben

  delete p;
}


Wenn du dann noch zur Laufzeit entscheiden willst, welche Klasse du instanziieren willst, brauchst du ne Factory. Ich hab da mal was zu geschrieben, du findest es hier: www.dev-geeks.org/forum/viewtopic.php?t=110


Bearbeitung:

(unschuldig pfeifend...) Da hat nie ein : public A nach struct B gefehlt, und virtuals Kommentar war völlig zusammenhangslos... *hust*


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.10.2004 um 15:34 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.10.2004, 15:28 Uhr
virtual
Sexiest Bit alive
(Operator)


@beefy
WIe soll denn der Code oben funktionieren, deiner Meinung nach?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.10.2004, 15:40 Uhr
0xdeadbeef
Gott
(Operator)


OK, OK. Auch ein Gott kann mal Fehler machen, oder? Ich bin immerhin allmächtig.

Ich hab den Fehler aus Platzgründen gleich oben korrigiert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.10.2004 um 15:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.10.2004, 19:24 Uhr
~c0x
Gast


nun gut, eine class factory... für größere sachen wie zb renderer (in der spieleprogrammierung) ist das sicherlich angemessen, aber zb (wran ich zZ arbeite)
nehmen wir mal eine string kllasse. es gibt mehrere implementationen für strings (eine implementation, die TCHAR arrays und c-funktionen benutzt, eine, die std::basic_string<TCHAR> verwendet und vlt. noch eine, die (MFC) CString benutzt) und nun möchte ich ein interface haben (zB IString), damit ich jede mögliche string implementation an funktionen übergeben kann, die strings als parameter nehmen.
ich kam dabei auch schon auf vererbung (is ja auch egtl. das naheliegenste), aber als ich zu folgender methode (im interface) kam:

C++:
// in der deklaration von IString...
virtual IString SubString(std::size_t Offset, std::size_t Count = -1) const;


wusste ich nicht weiter bei den implementationen... wie sollte ich diese funktion überladen? ich kann in zB der STL String implementation kein IString zurück liefern, IString hat ja keine member (keinen member string), sodass ausdrücke wie:

C++:
void func(IString& str)
{
    cout << str.CharArray();
}
STLString string(_T("Hallo"));
func(string.SubString(3));


nicht mehr möglich sind, da in substring ein lokales stlstring objekt konstruiert wird, jedoch beim zurück geben zu einem istring wird, dessen chararray methode NULL zurück liefert... wie kann ich solche probleme denn umgehen/lösen??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: