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 

Typerkennung bei Klassenhirarchie

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





PostPosted: Mon Oct 04, 2004 9:06 pm    Post subject: Typerkennung bei Klassenhirarchie Reply with quote



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





PostPosted: Tue Oct 05, 2004 9:04 am    Post subject: Re: Typerkennung bei Klassenhirarchie Reply with quote



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





PostPosted: Tue Oct 05, 2004 3:38 pm    Post subject: Re: Typerkennung bei Klassenhirarchie Reply with quote



Hi!

Quote:
Hallo Oliver, die Idee mit einer Map finde ich nicht so schlecht.

Ok, dann danke erst einmal für das Feedback Smile 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





PostPosted: Tue Oct 05, 2004 4:07 pm    Post subject: Re: Typerkennung bei Klassenhirarchie Reply with quote

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