 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Rene Moehring Guest
|
Posted: Fri Apr 08, 2005 2:01 pm Post subject: Verschiedene Klassen in einen Container packen |
|
|
Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Maps ist auch irgendwie blöd, da wie oben gesagt alles über dieselbe ID
referenziert wird, ich also auf der Suche nach einem Datensatz in allen
Maps suchen müsste. Momentan habe ich das Ganze mit boost::variant
realisiert. Das hat aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Wie würdet ihr so ein Problem lösen?
--
I'm not a racist. I hate everyone equally!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Apr 08, 2005 5:33 pm Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
Rene Moehring <rene_moehring (AT) gmx (DOT) de> writes:
| Quote: | Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Maps ist auch irgendwie blöd, da wie oben gesagt alles über dieselbe ID
referenziert wird, ich also auf der Suche nach einem Datensatz in allen
Maps suchen müsste. Momentan habe ich das Ganze mit boost::variant
realisiert. Das hat aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Wie würdet ihr so ein Problem lösen?
|
Was machst Du denn mit diesen Objekten, sobald Du sie mal in der Map
hast?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Fri Apr 08, 2005 6:34 pm Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
Rene Moehring wrote:
| Quote: | Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. [...]. Das hat
aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
|
Irgendwie widersprichst du dir hier (oder ich hab dich missverstanden).
Du hast ein apply_visitor, dass auf jedem Objekt irgendwelche
Memberfunktionen aufrufen soll. Das ist doch dann das gemeinsame
Interface. Also eine abstrakte Basisklasse gebaut und Pointer darauf in
die map gehängt.
Oder meinst du damit, dass die drei Klassen unveränderlich sind, kein
gemeinsames Interface haben und du auch keins hinzufügen kannst?
Wenn du Kontrolle über die Konstruktion der Objekte hast, kannst du ja
mit Mehrfachvererbung noch was drehen.
class CommonInterface {
public:
virtual void doSomething() = 0;
};
class FirstClassCI : public FirstClass, public CommonInterface {
void doSomething() {
// hier die aufzurufende Methode aufrufen
FirstClass::wasAuchImmer();
}
};
Ansonsten dürfte außer einem irgendwie geartetne Typeswitch nicht viel
übrig bleiben.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Ernst Murnleitner Guest
|
Posted: Sun Apr 10, 2005 10:17 pm Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
Rene Moehring wrote:
| Quote: | Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
|
Ich hatte auch mal so ein Problem. Alle Lösungen sind nicht sehr
elegant. Dann habe ich mir gedacht, dass in so einem Fall das Design
wohl nicht so optimal ist. Was spricht dagegen, 3 einzelne Maps zu
verwenden?
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rene Moehring Guest
|
Posted: Mon Apr 11, 2005 8:00 am Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
On Fri, 08 Apr 2005 19:33:09 +0200, Thomas Maeder wrote:
| Quote: | Rene Moehring <rene_moehring (AT) gmx (DOT) de> writes:
Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Maps ist auch irgendwie blöd, da wie oben gesagt alles über dieselbe ID
referenziert wird, ich also auf der Suche nach einem Datensatz in allen
Maps suchen müsste. Momentan habe ich das Ganze mit boost::variant
realisiert. Das hat aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Wie würdet ihr so ein Problem lösen?
Was machst Du denn mit diesen Objekten, sobald Du sie mal in der Map
hast?
|
Also das Programm ist ein Server und die Objekte stehen für angemeldete
Clients. Der Server empfängt Nachrichten und setzt diese auf die
passenden Memberfunktionen der jeweiligen Objekte/Klassen um, um die
Aktion austuführen. Nur können die verschiedenen Klassen eben
verschiedene Nachrichten verarbeiten und haben daher unterschiedliche
Interfaces bzw kurz gesagt der Server muß mit verschiedenen Arten von
Clients klar kommen.
--
I'm not a racist. I hate everyone equally!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rene Moehring Guest
|
Posted: Mon Apr 11, 2005 8:00 am Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
On Fri, 08 Apr 2005 20:34:00 +0200, Stefan Reuther wrote:
| Quote: | Rene Moehring wrote:
Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. [...]. Das hat
aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Irgendwie widersprichst du dir hier (oder ich hab dich missverstanden).
Du hast ein apply_visitor, dass auf jedem Objekt irgendwelche
Memberfunktionen aufrufen soll. Das ist doch dann das gemeinsame
Interface. Also eine abstrakte Basisklasse gebaut und Pointer darauf in
die map gehängt.
Oder meinst du damit, dass die drei Klassen unveränderlich sind, kein
gemeinsames Interface haben und du auch keins hinzufügen kannst?
|
Ja, letzteres meine ich.
| Quote: | Wenn du Kontrolle über die Konstruktion der Objekte hast, kannst du ja
mit Mehrfachvererbung noch was drehen.
class CommonInterface {
public:
virtual void doSomething() = 0;
};
class FirstClassCI : public FirstClass, public CommonInterface {
void doSomething() {
// hier die aufzurufende Methode aufrufen
FirstClass::wasAuchImmer();
}
};
|
Muß ich mal in Ruhe drüber nachdenken.
| Quote: | Ansonsten dürfte außer einem irgendwie geartetne Typeswitch nicht viel
übrig bleiben.
|
Na gut wenns sein muß, dann muß es eben sein.
--
I'm not a racist. I hate everyone equally!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martin Kaul Guest
|
Posted: Mon Apr 11, 2005 11:38 am Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
Rene Moehring wrote:
| Quote: | Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Maps ist auch irgendwie blöd, da wie oben gesagt alles über dieselbe ID
referenziert wird, ich also auf der Suche nach einem Datensatz in allen
Maps suchen müsste. Momentan habe ich das Ganze mit boost::variant
realisiert. Das hat aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Wie würdet ihr so ein Problem lösen?
hmm, du könntest das Bridge Muster nehmen, d.h. für alle drei Klassen |
(Implementierung) jeweils ne Abstraktion basteln und alle Abstraktionen
von ner gemeinsammen Basisklasse ableiten, d.h. im Container steckt dann
die Abstraktion und jede Abstraktion hat nen Link zur konkreten Klasse.
Die Abstraktions Basisklasse braucht dann ein gemeinsammes Interface
(z.B. drei Methoden wobei jede Methode ein Pointer auf deine Klasse
zurückgibt) um einen Zugriff auf die konkrete Implementierung zu
ermöglichen.
tschaule
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Mon Apr 11, 2005 7:22 pm Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
Rene Moehring <rene_moehring (AT) gmx (DOT) de> writes:
| Quote: | Was machst Du denn mit diesen Objekten, sobald Du sie mal in der
Map hast?
Also das Programm ist ein Server und die Objekte stehen für
angemeldete Clients. Der Server empfängt Nachrichten und setzt diese
auf die passenden Memberfunktionen der jeweiligen Objekte/Klassen
um, um die Aktion austuführen. Nur können die verschiedenen Klassen
eben verschiedene Nachrichten verarbeiten und haben daher
unterschiedliche Interfaces bzw kurz gesagt der Server muß mit
verschiedenen Arten von Clients klar kommen.
|
Ein Ansatz würde darin bestehen, dass die Map-Elemente ein Interface
implementieren:
class MessageHandler
{
public:
// behandelt die Meldung gemäss dem jeweiligen Client-Objekt
virtual void handle(Message const &) = 0;
};
typedef std::map< key_type, boost::shared_ptr handlers_type;
handlers_type handlers;
Und wenn dann eine Message m daherkommt, z.B.:
key_type const key(computeKey(m));
handlers_type::iterator const pos(handlers.find(key));
assert(pos!=handlers.end());
assert(pos->second.get()!=0);
pos->second->handle(m);
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rene Moehring Guest
|
Posted: Wed Apr 13, 2005 11:19 am Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
On Mon, 11 Apr 2005 00:17:25 +0200, Ernst Murnleitner wrote:
| Quote: | Rene Moehring wrote:
Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Ich hatte auch mal so ein Problem. Alle Lösungen sind nicht sehr
elegant. Dann habe ich mir gedacht, dass in so einem Fall das Design
wohl nicht so optimal ist. Was spricht dagegen, 3 einzelne Maps zu
verwenden?
Im Prinzip der Aufwand 3 Maps zu verwalten statt einer. Zum Beispiel muß |
ab und zu anhand der ID ein Objekt raussuchen. Bei 3 Maps muß ich alle 3
durchsuchen um was zu finden. Ich bin aber noch am überlegen ob ichs
nicht trotzdem mache.
--
I'm not a racist. I hate everyone equally!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
M G Berberich Guest
|
Posted: Wed Apr 20, 2005 8:29 pm Post subject: Re: Verschiedene Klassen in einen Container packen |
|
|
On Fri, 8 Apr 2005 16:01:26 +0200, Rene Moehring <rene_moehring (AT) gmx (DOT) de> wrote:
| Quote: | Ich habe zur Zeit das Problem, daß ich Objekte von 3 verschiedenen
Klassen in eine Map packen (Werden alle über die ID aus einer
Datenbanktablle identifiziert). Normalerweise gehen da aber nur Variablen
von selben Typ rein. Da die 3 Klassen aber ein unterschiedliches
Interface haben fällt Ableitung/Polymorphie wohl aus. 3 verschiedene
Maps ist auch irgendwie blöd, da wie oben gesagt alles über dieselbe ID
referenziert wird, ich also auf der Suche nach einem Datensatz in allen
Maps suchen müsste. Momentan habe ich das Ganze mit boost::variant
realisiert. Das hat aber wieder den Nachteil, daß ich Funktoren für jede
Memberfunktion schreiben muß (oder eine mit einem riesiegen switch für
jede Klasse) damit apply_visitor das Richtige für jedes Objekt tut.
Wie würdet ihr so ein Problem lösen?
|
wenn die Klassen kopykunstruktoren haben, würde ich's so versuchen:
class U
{
int type;
union {
A *a;
B *b;
C *c;
};
public:
U(const A &o) : type(1) { a = new A(o);}
U(const B &o) : type(2) { b = new B(o);}
U(const C &o) : type(3) { c = new C(o);}
~U() {
switch (type) {
case 1: delete a; break;
case 2: delete b; break;
case 3: delete c; break;
}
}
A &getA() { return *a; }
B &getB() { return *b; }
C &getC() { return *c; }
};
map<ID, U>
@group: Könnte man das auch mit RTTI anstatt "int type" lösen?
MfG
bmg
--
"Des is völlig wurscht, was heut beschlos- | M G Berberich
sen wird: I bin sowieso dagegn!" | [email]berberic (AT) fmi (DOT) uni-passau.de[/email]
(SPD-Stadtrat Kurt Schindler; Regensburg) | www.fmi.uni-passau.de/~berberic
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|