Archiv verlassen und diese Seite im Standarddesign anzeigen : Objekte anders erzeugen
Hi C++-Experten,
gibt es in C++ die Möglichkeit, Objekte mit ihrem Namen (als String!) zu erstellen, etwa so wie die CreateObject()-Funktion in VisualBasic, was auf C++ übertragen vielleicht so aussehen könnte:
string s = CreateObject("std::string");
Gibt es sowas ähnliches in C++?
mfg
Chaq
Felix Kaiser
17.07.2002, 15:32
Über einen String nicht (was auch ne dumme Idee), sondern mehr wie bei Delphi über einen Direktaufruf:
TStringList = new TStringList(); // Stringlisten Objekt erstellen
Zumal ein String in dem Sinne kein Objekt ist, eher ein Datentyp, von daher keine derartige Inizialisierung bedarf.
NEIN sowas gibt es nicht!
C++ / Delphi eigenlich alle moderen Programmiersprachen (ok ich gebs zu bin vb hasser ;) ;) ) haben fuer solche (sagen wir aehnliche) probleme oop (objektorientierung).
nur mal ein sample
// der vater
class a {
virual x ();
};
// die kinder
class b {
virual x ();
};
class c {
virual x ();
};
// das proggi
a *x;
ok nun kann ich als a eine classe a, b oder c nehmen
zb
if (booo)
a = new b ();
else
a = new c ();
a->x ();
// ist in a ein objekt als b dann wird x von b ausgefuehrt
// ist in a ein objekt als c dann wird x von c ausgefuehrt
@ Felix Kaiser
kann es sein dass du die frage falsch verstanden hast, oder hast du nie das oop von vb erlebt, da hilft weder :eek: noch :mad: und schon gar nicht :mauer: hoechstens :( **hopfschuettel**
also ich glaube die antworter haben die frage nicht ganz verstanden (oder ich verstehe sie falsch:))
sorry, bin kein c++ spezi, kann nur sagen, dass das java äquivalent dazu folgendermassen lautet:
Class.forName("klassenname");
sowas gibt's mit sicherheit auch für c(++)
@MrEasy: du hast meine Frage verstanden, der Rest tendenziell eher nicht :mad:
Ich brauche quasi einen Weg in C++ Objekte zu erzeugen, von denen ich den Namen kenne (also als Zeichenkette) :eek:
Folgende Beispiel-Situation:
Superklasse obj = WieAuchImmerDieFunktionHeißt("NameDerAbgeleitetenKlasse");
Ich weiß, dass ich den Konstruktor auch direkt aufrufen kann, aber für mein konkretes Problem brauche ich halt den Umweg über Zeichenketten o.ä.
Die forName-Methode ist, wie MrEasy bereits erwähnt hat, etwas vergleichbares in Java: http://java.sun.com/products/jdk/1.1/docs/api/java.lang.Class.html#forName(java.lang.String)
Genau so etwas suche ich jetzt in C++. Falls also jemand eine Idee hat, dann her damit...
Gruß
Chaq
@Chaq
vielleicht könntest du uns ja mal dein "konkretes problem" etwas genauer erklären.
es gibt meistens mehrere wege ein problem zu lösen.
ich verstehe was du erreichen willst nur ich sehe nicht ganz ein .... wozu?
wenn du in c++ ein objekt erzeugst geht das so:
klasse *zeiger = new klasse;
du kannst NICHT folgendes:
klasse *zeiger = new andere_klasse;
du kannst höchstens:
basis_klasse *zeiger = new abgeleitete_klasse; // == Polymorphie
aber auch in diesem fall MUSST du wissen wie die abgeleiteten klassen heißen.
(von denen kann es ja nicht sooo viele geben!)
da könnte man doch einfach...
string s;
cin >> s;
if (s=="abgeleitete_klasse_yxz")
basis_klasse *zeiger = new abgeleitete_klasse_yxz;
if (s=="abgeleitete_klasse_abc")
basis_klasse *zeiger = new abgeleitete_klasse_abc;
etc..etc..
von einer funktion wie "forName" in java, ist mir in c++ nichts bekannt.
zur verwendung: bei interface-programmierung halte ich das genze für ziemlich unersetzlich, da kommt man zwar auch mit if(string=foo) dann lade classe bar weiter, aber das ist nicht gerade elegant
das sagt sun dazu: (quelle: http://developer.java.sun.com/developer/technicalArticles/DataTypes/ObjectsConscious/ )
In nonobject-oriented programming languages, the type of each element must be known at compile time, which results in very inflexible code. Object-oriented languages relax this constraint--only the kind of element needs to be known. Java takes this a step further. Interfaces allow Java code to refer to behavior of an object regardless of the kind of object.
Certainly flexibility in how a program refers to data elements is crucial, but what about the creation of data elements? Consider a method, tmake, that constructs a generic tree data structure. To create the various nodes, tmake would do a lot of new TreeNode() operations. Now imagine that you must subclass the generic tree nodes, defining MyTreeNode, to add specific behavior. The method tmake could not be reused to create trees consisting of MyTreeNode elements--it is restricted to creating elements of a specific type. Java provides a solution to this inflexibility by allowing programs to specify variable type information, thus, deferring type information to runtime.
Class definitions in many object-oriented languages, such as C++, are compile-time entities that mainly specify how the compiler is to lay out memory. Because Java binds method names to code on-the-fly at runtime, Java class definitions must exist at runtime. Consequently, each Java class in your program results in a corresponding class definition object of type Class.
@MrEasy: Danke, dass du bestätigst, dass mein Anliegen nicht ganz so sinnlos ist, wie thos vermutet. :D
@thos: Danke, dass du uns nochmal OOP und Polymorphismus erklärst :eek:
Du willst es also etwas genauer haben:
Mein Programm soll so erweiterbar sein, sodass ich zur Laufzeit neue (abgeleitete) Klassen zu meinem Programm hinzufügen kann. Ich habe da zwei Teilprobleme gesehen:
1) beim Kompilieren des Programms weiß ich nicht, wie die neuen Klassen heißen werden, die nachgeladen werden sollen. Deshalb ist meine Frage hier entstanden, wie ich Instanzen von Klassen erzeugen kann, von den ich zur Laufzeit den Namen z.B. nur als Zeichenkette habe (weil man diese dem Programm über nen Config-Datei beibringen könnte).
2.) das Laden von zusätzlichen Klassen zur Laufzeit aus sowas, was man unter Windoof als "DLL" bezeichnen würde.
Als ich nun im Inet nach einer Lösung für Problem 2 gesucht habe, habe ich (soweit ich das erkennen kann) auch die Lösung für Problem 1 gefunden. Hier der Link zu dem Artikel: http://www.linuxjournal.com/article.php?sid=3687 .
Trotzdem vielen Danke an die Leute, die sich den Kopf darüber zerbrochen haben, was ich mit meiner Frage eventuell hätte meinen können. ;) :mauer:
Gruß
Chaq
also soweit ich weiss gibt es KEINE solche funktion und es wundert mich, dass es sowas in java gibt
Java ist in Sachen Objektorientierung meiner Meinung nach eleganter und besser als C++. Leider ist Java aber nicht so schnell wie C oder C++, sonst würde ich viel mehr Sachen in Java coden:p
Gruß
Chaq
Java geht gut fuers internet aber ist meiner meinung nach zu weit vom betriebssystem weg, zu weit von den apis und ist zu lahm! .net schliesst vielleicht diese luecke
Original geschrieben von xOOn
Java geht gut fuers internet aber ist meiner meinung nach zu weit vom betriebssystem weg, zu weit von den apis und ist zu lahm! .net schliesst vielleicht diese luecke
ohne jetzt eine java vs. c diskussion in gang bringen zu wollen, denke ich, dass man der sprache unrecht tut, wenn man sie auf applets + web-applications reduziert.
zum thema speed würde ich mal behaupten, dass 95% aller coder überhaupt nicht mit dem entsprechenden wissen augestattet sind, um laufzeitkritische anwendungen entsprechend zu coden, und dies ist ja auch so gut wie nie nötig, bei dem kleinen anteil von anwendungen die speed wirklich brauchen gebe ich dir recht, da ist C nach wie vor schneller, weil zur laufzeit kein interpreter benötigt wird
ich gebs ja zu ich hasse vb und mag java nicht sonderlich:D :D :D
@Chaq
sorry, ich wollte nicht überheblich wirken, ich wusste ja nicht wie weit du schon in c++ bist.
@thos: genau genommen lerne ich momentan noch C/C++, aber OOP kenne ich halt schon aus Java, Oberon etc. Ich habe deinen Beitrag auch nicht als überheblich betrachtet.
@vb-java-c++-diskutierer: Ich habe früher viel mit VB gemacht (hab halt coden mit QBASIC gelernt, da liegt es natürlich nahe, VB mal auszuprobieren).
Mittlerweile habe ich diverse Sprachen kennengelernt und denke:
1.) Java ist elegant und einfach zu lernen :D
2.) C/C++ ist sehr "mächtig" und schneller in der Ausführung :)
3.) VB ist gut um "schnell mal eben ne Windoof-Oberfläche zusammenzuklicken und mit ein paar erweiterten BASIC-Kenntnisse ein Programm dahinterzupacken" :eek:
4.) hier hört die Liste auf, weil ich schweife zu weit vom Thema ab, das mittlerweile geklärt ist.
Gruß
Chaq
3.) VB ist gut um "schnell mal eben ne Windoof-Oberfläche zusammenzuklicken und mit ein paar erweiterten BASIC-Kenntnisse ein Programm dahinterzupacken
also ich habe auch lange mit qbasic und dass visual basic gecodet, deshalb ist es nicht so, dass ich gegen vb bin weil es herr xy mal gesagt hat. meiner meinung hat vb viele wiedersprueche wie kann man mit komponenten nutzen die auf oop basieren, wenn die sprache kein oop benutzt, oder wie kann man Winapi's aufrufen die pointer benutzen wenn es keinen pointer gibt, ...
also von mir aus kann jeder gerne in vb coden, weil jedem das seine
Mephisto_I
07.08.2002, 12:59
Original geschrieben von Chaq
Mein Programm soll so erweiterbar sein, sodass ich zur Laufzeit neue (abgeleitete) Klassen zu meinem Programm hinzufügen kann. Ich habe da zwei Teilprobleme gesehen:
1) beim Kompilieren des Programms weiß ich nicht, wie die neuen Klassen heißen werden, die nachgeladen werden sollen. Deshalb ist meine Frage hier entstanden, wie ich Instanzen von Klassen erzeugen kann, von den ich zur Laufzeit den Namen z.B. nur als Zeichenkette habe (weil man diese dem Programm über nen Config-Datei beibringen könnte).
2.) das Laden von zusätzlichen Klassen zur Laufzeit aus sowas, was man unter Windoof als "DLL" bezeichnen würde.
Wie genau enstehen die Klassen? Wo kommen sie her? Sind es wirklich Klassen, oder lassen sich die "Dinger" doch irgendwie anders beschreiben?
Ohne Antworten auf diese Fragen ist es schwierig, deine Frage sinnvoll zu beantworten.
Class.forName("klassenname"); gibt es C++ wirklich nicht. Und IMO sieht das nach schlechtem Code aus, wenn man solche Konstrukte wirklich braucht, um ein Problem zu loesen.
Ein Schuss ins Blaue: Du suchst eine Factory. Google mal nach "design pattern factory".
HTH
Mephisto_I
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.