alternative für RTTI
-
fragezeichen? schrieb:
die IDs muss man sich halt merken. zeiger kann man sich aber nicht merken.
entweder ich speichere irgentwo unmengen an zeigern, die nur für eine methode
aufgerufen werden, oder ich löse das über IDs.Und das mit den IDs ist Quatsch wie du doch schon selber merkst. Ob du dir eine ID oder nen Pointer als Member einer Klasse hältst ist doch egal. Schau dir mal andere GUI Frameworks an.
http://doc.trolltech.com/4.0/examples.html
-
volkard schrieb:
die template-funktion getElement merke ich mir, die wird praktisch sein, wenn ich mal groß bin und ein MMORPG schreibe. über's netz fliegen ja nur IDs von den mobs, vielleicht ist es dann gut, wenn ich alle objekte mit IDs verwalte. macht auch das speichern und laden viel einfacher.
es lebe das id system
premature optimization schrieb:
Und das mit den IDs ist Quatsch wie du doch schon selber merkst. Ob du dir eine ID oder nen Pointer als Member einer Klasse hältst ist doch egal.
wenn man die ids eh als member speichert, macht das wenig sinn, da hast du recht.
wenn man aber statische ids vergibt, und in der lage ist sich diese 2min zu
merken, kann man in einer anderen methode oder funktion (die keinen zugriff
auf die verwaltungsklasse hat) den zeiger weiterverwenden.und wie volkard schon sagte, wenn man übers netz auf objekte zugreifen will,
werden zeiger sicherlich probleme machen. man kann die gültigkeit nicht
prüfen und das auf jedem client die daten an der selben stelle liegen, ist
sehr unwahrscheinlicht.
-
volkard schrieb:
die template-funktion getElement merke ich mir, die wird praktisch sein, wenn ich mal groß bin und ein MMORPG schreibe. über's netz fliegen ja nur IDs von den mobs, vielleicht ist es dann gut, wenn ich alle objekte mit IDs verwalte. macht auch das speichern und laden viel einfacher.
Ok, dass verstehe ich jetzt nicht. War das ironisch gemeint oder ist der Zugriff auf Objekte per ID wirklich so toll
Kann man sich denn die Objekte (Buttons, Scrollbars usw...) nicht in unterschiedlichen Listen merken und vieleicht mit sowas hier den Zeiger holen?
// Verschiedene Gui Elemente class Gui { public: enum type{ Undefined, Button, Scrollbar } } // ein Steuerelement class Button public Control { private: int type; public: Button() { type = Gui::Button; } } // ein Menü mit Buttons usw... class MainMenu public Gui { protected: std::map<int,Button*> buttons; std::map<int,Scrollbar*> bars; public: bool typeOf(id, Gui::type); Button* getButton(id); Scrollbar* getScrollbar(); void addElement( Control* ctrl, int posX, int posY ); } // irgendwo im Code int foo { MainMenu menu; menu.addElement( new Button(1234), x, y ); if( menu.typeOf(1234,Gui::Button) ) { Button* button = menu.getButton(id); button.setText("Ok"); } }
Ok der Code ist mit Vorsicht zu genießen (hab schon lange kein C++ mehr programmiert und jetzt auch keine Zeit die genaue Syntax rauszusuchen). Aber eigentlich könnte man doch auf diese Weise auch ohne dynamic Cast auskommen. Oder muss ich in addElement von Control* nach Button* casten?
-
fragezeichen? schrieb:
meine jetzige lösung ist ein
virtual edit *getedit() {return 0;} virtual button *getbutton() {return 0;} virtual window *getwindow() {return 0;} // ...
die jeweilige methode wird von den abgeleiteten klassen durch return this
ersetzt. das klappt ganz gut, ist dem prinzip ziemlich ähnlich aber ist schneller.was haltet ihr davon?
Es würde reichen, wenn du nur eine getFunktion in der Basisklasse definieren würdest.
Basis: virtual element* getTyp() = 0; Button: virtual button* getTyp() { return this; } Window: virtual window* getTyp() { return this; }
Nennt sich CoVariant-Returntype ...
-
KasF schrieb:
Es würde reichen, wenn du nur eine getFunktion in der Basisklasse definieren würdest.
Basis: virtual element* getTyp() = 0; Button: virtual button* getTyp() { return this; } Window: virtual window* getTyp() { return this; }
Nennt sich CoVariant-Returntype ...
fein. und geht dann auch
g->getTyp(4711)->getTyp(1234)->funktionDieNurButtonHat("hallo");
?
woher weiß der compiler, daß es dort erlaubt ist, funktionDieNurButtonHat aufzurufen? oder läßt er prophylaktisch einfach mal alle funktionen zu, die in irgendeiner geerbten klasse liegen?
-
fragezeichen? schrieb:
premature optimization schrieb:
Und das mit den IDs ist Quatsch wie du doch schon selber merkst. Ob du dir eine ID oder nen Pointer als Member einer Klasse hältst ist doch egal.
wenn man die ids eh als member speichert, macht das wenig sinn, da hast du recht.
wenn man aber statische ids vergibt, und in der lage ist sich diese 2min zu
merken, kann man in einer anderen methode oder funktion (die keinen zugriff
auf die verwaltungsklasse hat) den zeiger weiterverwenden.und wie volkard schon sagte, wenn man übers netz auf objekte zugreifen will,
werden zeiger sicherlich probleme machen. man kann die gültigkeit nicht
prüfen und das auf jedem client die daten an der selben stelle liegen, ist
sehr unwahrscheinlicht.Klingt für mich nach nem extrem kaotischen Design. Warum must du den so verteilt auf deine GUI zugreifen? Schon mal was von Observer-Pattern, MVC usw. gehört? Und warum willst du bitte übers Netz direkt auf die GUI zugreifen?
-
premature optimization schrieb:
Und warum willst du bitte übers Netz direkt auf die GUI zugreifen?
will ich nicht, es geht nur darum dass man das mit einem ID system könnte.
das system ist garnicht caotisch. kein cast, exeption bei fehlgriff und
kein dynamic_cast overhead. und wer die implementierung nicht kennt sieht
auch nix caotisches.
-
Die Architektur deiner Software ist schlecht, wenn du von so vielen verschiedenen Stellen auf die GUI zugreifst, das hat nix mit dynamic_cast und exceptions zu tun. Aber ich gebs jetzt auf, wenn du unnötig komplizierte Sachen mit IDs usw. machen willst, dann mach.
-
das ist nicht unnötig kompliziert.
ich habe eine zentrale instanz von der gui und will davon auf alle elemente
zugreifen.was würdest du den für diese situation vorschlagen?
ich will nicht für jeden knopf den ich erzeuge ein zeiger speichern.
-
fragezeichen? schrieb:
ich will nicht für jeden knopf den ich erzeuge ein zeiger speichern.
Schau dir einfach an wie es bestehende Systeme machen.
-
volkard schrieb:
g->getTyp(4711)->getTyp(1234)->funktionDieNurButtonHat("hallo");
?
woher weiß der compiler, daß es dort erlaubt ist, funktionDieNurButtonHat aufzurufen? oder läßt er prophylaktisch einfach mal alle funktionen zu, die in irgendeiner geerbten klasse liegen?Ok, kommt davon, wenn man den Thread nur überfliegt.
volkard schrieb:
fein
Es wäre erwünschenswert, wenn du dir mal ne andere Haltung im Forum angewöhnen könntest. 90% deiner Beiträge klingen so, als ob ganz TOLL wärst und über uns allen stehen würdest.Nur ne Bitte ...
-
ich finde deinen code aber wirklich fein. deswegen schrieb ich "fein". nur löste er in diesem fall keine wchtigen probleme.