PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Objekte anders erzeugen


Chaq
17.07.2002, 15:11
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.

xOOn
17.07.2002, 15:35
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

xOOn
17.07.2002, 15:40
@ 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**

MrEasy
17.07.2002, 18:19
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(++)

Chaq
17.07.2002, 18:49
@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

thos
17.07.2002, 19:50
@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.

MrEasy
17.07.2002, 22:14
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.

Chaq
18.07.2002, 08:22
@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

xOOn
18.07.2002, 08:35
also soweit ich weiss gibt es KEINE solche funktion und es wundert mich, dass es sowas in java gibt

Chaq
18.07.2002, 11:05
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

xOOn
18.07.2002, 11:21
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

MrEasy
18.07.2002, 12:32
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

xOOn
18.07.2002, 13:13
ich gebs ja zu ich hasse vb und mag java nicht sonderlich:D :D :D

thos
18.07.2002, 14:37
@Chaq

sorry, ich wollte nicht überheblich wirken, ich wusste ja nicht wie weit du schon in c++ bist.

Chaq
18.07.2002, 14:47
@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

xOOn
18.07.2002, 15:21
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