container für objekte verschieden types
-
hallo,
ich komme aus der java welt und da gibt es einen sehr praktischen container namens vector. darin kann ich objekte verschiedener typen ablegen und darauf zugreifen. nun meine frage, gibt es etwas ähnliches in c++? zur erklärung ein kurzes beispiel, wie das in java funktioniert:
class A{ // some code } class B{ // some code } class C{ void doSomething(A aObject, B bObject){ Vector myVect=new Vector(); myVect.add(aObject); myVect.add(bObject); ... } }besten dank im voraus
hans
-
Hi,
da ich kein Java kann, weiß ich nicht genau ob dir das weiter hilft, aber in C++ gibt es Vectoren.
Schau dir mal das an, vielleicht hilft dir das weiter.http://www.uni-muenster.de/ZIV/Mitarbeiter/ReinhardMersch/C++BasisKurs4.html
-
hallo,
erst mal danke für die schnelle antwort. ich habe mir den link angeschaut und bin gleich auf eine aussage getroffen, die ich schon vermutet habe :
...
Ein Vektor ist ein Reihe von Komponenten (Objekten) desselben Typs.
...
was ich aber suche wäre ein container für objekte verschiedenen typs. also beispielsweise wo ich einen int und einen double reintuen kann (nur eben keinen int und double, sondern objekte)hans
-
hanswurschtus schrieb:
hallo,
erst mal danke für die schnelle antwort. ich habe mir den link angeschaut und bin gleich auf eine aussage getroffen, die ich schon vermutet habe :
...
Ein Vektor ist ein Reihe von Komponenten (Objekten) desselben Typs.
...
was ich aber suche wäre ein container für objekte verschiedenen typs. also beispielsweise wo ich einen int und einen double reintuen kann (nur eben keinen int und double, sondern objekte)hans
variablen des typs int oder double SIND objekte in C++ - nur sind sie eben keine instanzen einer klasse. generizität wird in template basierenden container generell nicht durch dadurch erreicht, dass alle möglichen inhaltstypen teil einer klassenhierarchie sind, somit ist auch das "boxing" von einfachen typen nicht notwendig. für den genannten zweck gibt es mehrere lösungsmöglichkeiten, z.b. existieren in boost die any und variant container, die als elemente eines vectors dienen können. oder aber man fügt tatsächlich alle möglichen elementtypen in eine klassenhierarchie und baut dann einen vector<basis*> bzw. vector<shared_ptr<basis*> > bzw. ptr_vector<basis> etc.
ein vector<void*> wäre ebenfalls denkbar, dann muss man die typinformationen allerdings gesondert speichern. oder man baut eine einfache nichtpolymorphe klasse mit void* und typ-infofeld und macht daraus einen vector (das ist im grunde die primitive hands-on version von any/variant). die günstigste lösung wird wie immer vom einsatzzweck - der hier nicht erläutert wurde - abhängen.
-
hallo,
danke für die antwort, leider habe ich das nicht 100%ig verstanden. aber egal, ich erkläre mal was ich machen will. ich möchte ein art interface machen, von dem dann klassen abgeleitet werden können. das interface hat eine methode doSometing der als parameter eine menge von objekten übergeben werden können. die klasse selbst muss dann wissen, welche objekte übergeben wurden und was sie damit machen muss.
ich schreibe mal den java code her, was ich haben möchte in java, da ich nicht weiss, wie ich das in c++ lösen könnte.class A{ //something } class B{ // something } interface Base{ void doSomething(Vector vectorOfObjects); } class BaseExtension implements Base{ void doSomething(Vector vectorOfObjects){ //this class must know, which objects are in the vector and how to handle it } } class OtherBaseExtension implements Base{ void doSomething(Vector vectorOfObjects){ // this class must know too, // which objects are in the vector and how to handle it } } class Caller{ void doIt(){ A a=new A(); B b=new B(); Vector v1=new Vector(); v1.add(a); v1.add(b); Base worker1=new BaseExtension(); worker1.doSomething(v1); // das gleiche sollte auch mit OtherBaseExtension gehen Vector v2=new Vector(); v2.add(new String("OtherBaseExtension Class"); v2.add(b); Base worker2=new OtherBaseExtension(); worker2.doSomething(v2); } }
-
Ich würde alle "Something"-Klassen von einer gemeinsamen Basisklasse ableiten und dann einen vector<Base*> herumreichen.
(und die möglichen Operationen funktionieren am besten über virtuelle Methoden dieser Basisklasse)
-
CStoll schrieb:
Ich würde alle "Something"-Klassen von einer gemeinsamen Basisklasse ableiten und dann einen vector<Base*> herumreichen.
(und die möglichen Operationen funktionieren am besten über virtuelle Methoden dieser Basisklasse)
Jo und da das dynamisch wird, beim Entfernen von Elementen nicht das delete vergessen.
-
hanswurschtus! Das was du machen willst, ist böse. Sowohl vom Standpunkt der allgemeinen Programmierung als auch in Java! Das was C++ schon lange kann, hat Java erst mit Java 1.5 eingeführt. In Java 1.5 kannst du auch "nur" Objekte eines bestimmten Typs in einen Vector speichern. Und das zu Recht!
-
camper schrieb:
...variablen des typs int oder double SIND objekte in C++...
Bedeutet das dann für dich das in C++ alle Typen Objekte sind.

-
Redhead schrieb:
camper schrieb:
...variablen des typs int oder double SIND objekte in C++...
Bedeutet das dann für dich das in C++ alle Typen Objekte sind.

alles, was speicher braucht, ist ein objekt. wohlgemerkt, speicher im sinne des speichermodells, das C++ benutzt. nat. benötigt ausführbarer code ebenfalls speicher, aber functionen selbst sind keine objekte.