 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Oliver Putz Guest
|
Posted: Mon Oct 04, 2004 9:06 pm Post subject: Typerkennung bei Klassenhirarchie |
|
|
Hi, ich habe gerade ein kleines Problem und wollte mal fragen ob einer
von euch evtl einen Lösungsansatz hat. Ich hatte vor mir eine keine
Klassenhierarchie aufzubauen, und zwar in folgender Manier:
Aus einer Oberklasse Werkzeug werden mehrere verschiedene Tools
abgeleitet, wie Hammer, Schraubenzieher, Zange, etc abgeleitet. All
diese Objekte möchte ich gerne in einer Datenstruktur verwalten. Daher
auch die Idee mit der Ableitung. In dieser Datenstruktur speichere ich
also Pointer auf Werkzeuge. Nur die Frage jetzt: Wie kann ich überprüfen
ob ein bestimmtes Werkzeug in meiner Datenstruktur vorhanden ist?
Hierzu sehe ich momentan drei Möglichkeiten:
1) Dynamic Downcast. Problem: Nicht gerade die eleganteste Lösung, vor
allem da ich wahrscheinlich recht oft casten muss bis ich dann endlich
mal eventuell etwas passendes finde.
2) Speichern von Klasseninformationen. Hierbei würde ich alle eventuell
vorkommenden Elemente indiziert mit dem Klassennamen in eine map
stecken. Problem: Bei anfragen von außen müsste ich immer nach dem
String fragen und könnte nicht nach dem Objekt direkt fragen. Außerdem
erscheint es mir auch eine recht zusammengemurkste Lösung
3) In meiner Anwendung (nehmen wir mal eine Werkbank *g*) speichere ich
Pointer auf alle eventuell vorhandenen Werkzeuge. (also einen Pointer
für den Hammer, einen für die Zange, etc...) Problem: Das
Klasseninterface wird extrem groß, da ich nicht direkt nach einem
bestimmten Werkzeug suchen kann, sondern für jedes Werkzeug eine eigene
get Funktion brauche...
Alles in allem keine sehr schöne Situation.. Wollte hier mal fragen ob
ihr vielleicht einen Tipp habt wie ich das ganze etwas eleganter lösen
kann...
Kurz und knapp: Ich will in einer inhomogenen Datenstruktur/Liste nach
einem bestimmten Element suchen...
Danke schon mal im Voraus
Oliver
--
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 |
|
 |
Ralph Oliver Schunk Guest
|
Posted: Tue Oct 05, 2004 9:04 am Post subject: Re: Typerkennung bei Klassenhirarchie |
|
|
Oliver Putz <Ripper2004 (AT) web (DOT) de> wrote:
Hallo Oliver, die Idee mit einer Map finde ich nicht so schlecht.
| Quote: | Aus einer Oberklasse Werkzeug werden mehrere verschiedene Tools
abgeleitet, wie Hammer, Schraubenzieher, Zange, etc abgeleitet. All
diese Objekte möchte ich gerne in einer Datenstruktur verwalten. Daher
auch die Idee mit der Ableitung. In dieser Datenstruktur speichere ich
also Pointer auf Werkzeuge. Nur die Frage jetzt: Wie kann ich überprüfen
ob ein bestimmtes Werkzeug in meiner Datenstruktur vorhanden ist?
Hierzu sehe ich momentan drei Möglichkeiten:
1) Dynamic Downcast. Problem: Nicht gerade die eleganteste Lösung, vor
allem da ich wahrscheinlich recht oft casten muss bis ich dann endlich
mal eventuell etwas passendes finde.
Und die Laufzeit ist bescheiden. |
| Quote: |
2) Speichern von Klasseninformationen. Hierbei würde ich alle eventuell
vorkommenden Elemente indiziert mit dem Klassennamen in eine map
stecken. Problem: Bei anfragen von außen müsste ich immer nach dem
String fragen und könnte nicht nach dem Objekt direkt fragen. Außerdem
erscheint es mir auch eine recht zusammengemurkste Lösung
|
Siehe unten.
| Quote: |
3) In meiner Anwendung (nehmen wir mal eine Werkbank *g*) speichere ich
Pointer auf alle eventuell vorhandenen Werkzeuge. (also einen Pointer
für den Hammer, einen für die Zange, etc...) Problem: Das
Klasseninterface wird extrem groß, da ich nicht direkt nach einem
bestimmten Werkzeug suchen kann, sondern für jedes Werkzeug eine eigene
get Funktion brauche...
So etwas ist nur sinnvoll, wenn du weisst welcher Handwerker die Werkbank |
benutzt (sprich: die Menge an Werkzeugen eingegrenzt werden kann).
| Quote: |
Alles in allem keine sehr schöne Situation.. Wollte hier mal fragen ob
ihr vielleicht einen Tipp habt wie ich das ganze etwas eleganter lösen
kann...
Kurz und knapp: Ich will in einer inhomogenen Datenstruktur/Liste nach
einem bestimmten Element suchen...
Danke schon mal im Voraus
Oliver
|
Spontan im Geist haett' ich da folgendes:
#include <tischler.hpp>
#include <naegel.hpp>
#include <map>
using namespace std;
typedef const char* Name;
struct Werkzeug { virtual Name type()=0; virtual ~Werkzeug() {} };
struct Hammer : public Werkzeug { Name type() { return "Hammer"; } };
struct Feile : public Werkzeug { Name type() { return "Feile" ; } };
struct Zange : public Werkzeug { Name type() { return "Zange" ; } };
struct Werkbank
{
typedef Werkzeug* w_ptr;
map< Name, w_ptr > bank;
bool hat( Name n ) { return bank.find(n) != bank.end(); }
w_ptr operator()( Name n ) { return bank.find(n)->second; }
bool leg_rein( w_ptr w)
{
return bank.insert( make_pair( w->type(), w ) ).second;
}
void aufraeumen()
{
for ( map< Name, w_ptr >::iterator cur = bank.begin();
cur != bank.end(); ++cur )
{
delete cur->second;
}
}
~Werkbank() { aufraeumen(); }
/*
usw.
*/
};
int main()
{
Werkbank werkbank;
Werkzeug* werkzeug = new Feile();
werkbank.leg_rein( werkzeug );
werkzeug = new Hammer();
werkbank.leg_rein( werkzeug );
werkzeug = new Zange();
werkbank.leg_rein( werkzeug );
Tischler Anton;
if ( werkbank.hat( "Hammer" ) )
{
Anton.nimm( werkbank("Hammer") );
Anton.nutze_werkzeug_mit( Nagel() );
}
werkbank.aufraeumen();
return /* anton.feierabend() */ 0;
}
Gruß
Ralph
--
Es gibt 10 Arten von Menschen,
die, die Binär lesen können,
und die, die es nicht können.
--
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 |
|
 |
Oliver Putz Guest
|
Posted: Tue Oct 05, 2004 3:38 pm Post subject: Re: Typerkennung bei Klassenhirarchie |
|
|
Hi!
| Quote: | Hallo Oliver, die Idee mit einer Map finde ich nicht so schlecht.
|
Ok, dann danke erst einmal für das Feedback Die Map hätte natürlich
wirklich den Vorteil dass ich da logarithmische Suchzeit hätte statt
linearer.
| Quote: | Spontan im Geist haett' ich da folgendes:
|
[snip]
Hm, ok, also in etwa das was ich mir gedacht hatte: Eine Map mit dem
String des Objektes als Key und einem Pointer auf das Objekt als Value.
Aber die Idee mit dem Operator() gefällt mir. So könnte ich wenigstens
halbwegs gut mit Pointern auf Objekte direkt in der Map suchen und muss
nicht erst umständlich zwischen Objekt und seinem Namen unterscheiden :)
Danke. Dann werde ich mich mal an die Laufzeittests machen *g*
Oliver
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Tue Oct 05, 2004 4:07 pm Post subject: Re: Typerkennung bei Klassenhirarchie |
|
|
"Oliver Putz" <Ripper2004 (AT) web (DOT) de> schrieb:
| Quote: | Hm, ok, also in etwa das was ich mir gedacht hatte: Eine Map mit dem
String des Objektes als Key und einem Pointer auf das Objekt als Value.
|
Nimm statt der »map« ein »set« oder »multiset« und einen Vergleichs-
funktor, der »type_info::before« verwendet!
--
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
|
|