C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Verschiedene Klassen in einen Container packen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Rene Moehring
Guest





PostPosted: Fri Apr 08, 2005 2:01 pm    Post subject: Verschiedene Klassen in einen Container packen Reply with 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?

--
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





PostPosted: Fri Apr 08, 2005 5:33 pm    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote



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





PostPosted: Fri Apr 08, 2005 6:34 pm    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote



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





PostPosted: Sun Apr 10, 2005 10:17 pm    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Mon Apr 11, 2005 8:00 am    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Mon Apr 11, 2005 8:00 am    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Mon Apr 11, 2005 11:38 am    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Mon Apr 11, 2005 7:22 pm    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Wed Apr 13, 2005 11:19 am    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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





PostPosted: Wed Apr 20, 2005 8:29 pm    Post subject: Re: Verschiedene Klassen in einen Container packen Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.