Ist C++ wirklich so schlecht?
-
Original erstellt von Gregor:
Erklärung bitte!C++ kann jede Menge Sachen. Was von der Klassensemantik her kann Java, was C++ nicht kann?
-
Original erstellt von Gregor:
Erklärung bitte!ohoh ich sehs schon kommen ich sage jetzt irgendwas und werde dann zerissen weil ich mich mit anderen sprachen nicht so gut auskenne.
naja ich versuchs mal:
automatischer ctor und dtor aufruf
mehrfachvererbung
friendsach ich bin nicht erfahren genug um das jetzt vollständig begründen zu können. jedenfalls fällt mir nichts ein was ich mit c++ klassen nicht kann was in andere sprachen möglich wäre (AOP vielleicht???). ausserdem wollte ich ja damit nicht sagen das die klassen in c++ besser als die in z.B. java sind (ich nehme an du denkts in diese richtung). ich verstehe nur nicht wie man nach dem proggen von VB und java (so verstehe ich den ersten beitrag) sagen kann das c++ classen ein witz sind...
-
Original erstellt von Mr. N:
**
C++ kann jede Menge Sachen. Was von der Klassensemantik her kann Java, was C++ nicht kann?**Ich hatte nur eine Frage in Bezug auf C++ gestellt, weil ich die Aussage nicht nachvollziehen konnte. Inzwischen wurde ja gesagt, wie das gemeint war!
...ich sehe weder C++-Klassen, noch Java-Klassen, noch C#-Klassen als mächtiger an.
BTW : Wo du fragst : Gibt es eigentlich soetwas, wie Reflection bei C++?
[ Dieser Beitrag wurde am 15.01.2003 um 21:40 Uhr von Gregor editiert. ]
-
http://java.sun.com/docs/books/tutorial/reflect/ <--- is das damit gemeint?
hmm ich weiss net so genau was man in c++ mit der rtti anfangen kann weil ichs noch nie ernsthaft benutzt hab aber das scheint was "ähliches" zu sein. naja wobei man die klassen damit nicht während der laufzeit manipulieren kann...interessant scheint es mir ja schon aber wofür braucht man sowas kann mit momentan kaum ein einsatzgebiet vorstellen?
-
Ja, das hatte ich gemeint! Ich werde mir rtti demnächst mal angucken!
...ich nutze Reflection momentan in Verbindung mit Plugins.
-
reflection in c++ geht nicht
-
Original erstellt von Gregor:
...ich nutze Reflection momentan in Verbindung mit Plugins.Wie das?
-
java
-
Original erstellt von Mr. N:
Wie das?Naja! Ich durchsuche halt bei Programmstart ein Verzeichnis nach allen Java-Klassen, teste dann, welche mein Plugin-Interface implementieren, teile diese noch in ein paar verschiedene Kategorien ein, erzeuge mir mit Hilfe der geladenen Klassen einen Großteil meiner GUI und erzeuge mir bei Bedarf ein Objekt einer Klasse.
...vor allem kommt es mir also aufs dynamische Klassenladen an.
-
Ich durchsuche halt bei Programmstart ein Verzeichnis nach allen Java-Klassen
Wie soll das gehen?
-
Original erstellt von <Domian>:
Wie soll das gehen?Zum Beispiel so:
[java]
public static Class [] loadControllerClasses ()
{
java.net.URL controllerURL = PluginLoader.class.getResource ("/plugin");
LinkedList classList = new LinkedList();
try
{
File controllerDirectory = new File (new URI(controllerURL.toString ()));
File [] directories = getSubdirectories(controllerDirectory);
if (directories == null) return null;
for (int i = 0 ; i < directories.length ; ++i)
{
File [] files = directories[i].listFiles ();
for (int x = 0 ; x < files.length ; ++x)
{
Class currentClass = loadControllerClass (files[x]);
if (currentClass != null)
{
classList.add(currentClass);
}
}
}
}
catch (java.net.URISyntaxException e)
{
return null;
}
Class [] outArray = new Class [classList.size ()];
Iterator iterator = classList.iterator ();
for (int i = 0 ; i < outArray.length ; ++i)
{
outArray[i] = (Class)iterator.next ();
}
return outArray;
}private static File [] getSubdirectories (File directory)
{
if (!directory.isDirectory ()) return null;
ArrayList directoryList = new ArrayList();
File [] files = directory.listFiles ();
for (int i = 0 ; i < files.length ; ++i)
{
if (files[i].isDirectory ()) directoryList.add(files[i]);
}
int length = directoryList.size ();
for (int i = 0 ; i < length ; ++i)
{
File [] newDirectories = getSubdirectories((File)directoryList.get (i));
for (int x = 0 ; x < newDirectories.length ; ++x)
{
directoryList.add(newDirectories[x]);
}
}
File [] directoryArray = new File [directoryList.size ()];
for (int i = 0 ; i < directoryArray.length ; ++i)
{
directoryArray [i] = (File) directoryList.get(i);
}
return directoryArray;
}private static Class loadControllerClass(File classFile)
{
String className = classFile.getAbsolutePath ();
if (!className.endsWith (".class")) return null;
if (!classFile.getParentFile ().getAbsolutePath ().endsWith ("controller")) return null;
int start = className.indexOf ("plugin");
className = className.substring (start,className.length()-6);
className = className.replace (File.separatorChar,'.');
try
{
Class loadedClass = Class.forName (className);
if (Class.forName ("plugin.Plugin").isAssignableFrom (loadedClass))
{
return loadedClass;
}
}
catch (ClassNotFoundException e)
{
}
return null;
}[/code]
Der Code ist allerdings schon recht alt und ich bin nicht so zufrieden damit. ...muss ich wohl irgendwann überarbeiten.
-
Hallo,
Reflections haben wie fast alles ihre Vor- und Nachteile. Ein Vorteil ist ganz klar die Möglichkeit der Reduzierung statischer Abhängigkeiten. Man kann relativ einfach neue Komponenten in ein Programm einbinden ohne irgendetwas neu kompilieren (oder neu ausliefern) zu müssen. Man kann also sehr gut statische Typeinschränkungen aufweichen und vieles auf Stringbasis erledigen.Hier liegt aber auch einer der Nachteile. Viele Fehler können so nur noch zur Laufzeit erkannt werden, da zur Compilezeit die notwendigen Informationen noch gar nicht vorliegen. Und Laufzeitfehler sind bekanntlich böse Fehler.
Übertrieben häufig angewendet resultiert Reflection häufig auch in unnützer Komplexität.
Ich könnte mir allerdings gut vorstellen, dass der neue C++ Standard auch etwas zum Thema Reflections zu sagen haben wird. Auch wenn der Wunsch nach einem Reflection-System in der C++ Community nicht so verbreitet (gewünscht) ist. Liegt wohl daran, dass sich selbige Community in den letzten Jahren mehr mit Temlates als mit allem anderen beschäftigt hat
-
Ist sowas wie Reflections überhaupt möglich in einer "compilieren Sprache"?
-
Original erstellt von <Startguthaben>:
Ist sowas wie Reflections überhaupt möglich in einer "compilieren Sprache"?man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );
-
Original erstellt von Dimah:
man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );jo. sehe den sinn von reflection hier nicht.
-
Original erstellt von Mr. N:
[quote]Original erstellt von Dimah:
[qb]man macht einfach eine klasse die zu laufzeit eine dll läd, funktions aufrufe passieren dan ca. so ReflectionSimulator.run_func( "sag_hallo_world" );jo. sehe den sinn von reflection hier nicht.[/QB][/QUOTE]
Ich weiß nicht, was man da alles mit C++ machen kann. Deshalb aus Interesse:Zeig mal C++-Code, der ein Verzeichnis nach Klassen durchsucht, die von einer gegebenen Klasse abgeleitet sind. ...es sollen auch andere Klassen in dem Verzeichnis zu finden sein. Die entsprechenden Klassen, die du findest, speicherst du in einem Array, erstellst dann von jeder dieser Klassen ein Exemplar und läßt das Exemplar dann etwas machen, was es wegen der Oberklasse können muss.
...ich würde einen solchen Code gerne mal sehen, weil ich es eben noch nicht gesehen habe.
[ Dieser Beitrag wurde am 17.01.2003 um 00:02 Uhr von Gregor editiert. ]
-
+im moment geht das auf keinen fall. ich glaube auch nicht das es in der nächsten version von c++ geht.
-
Zeig mal C++-Code, der ein Verzeichnis nach Klassen durchsucht, die von einer gegebenen Klasse abgeleitet sind. ...es sollen auch andere Klassen in dem Verzeichnis zu finden sein. Die entsprechenden Klassen, die du findest, speicherst du in einem Array, erstellst dann von jeder dieser Klassen ein Exemplar und läßt das Exemplar dann etwas machen, was es wegen der Oberklasse können muss.
...ich würde einen solchen Code gerne mal sehen, weil ich es eben noch nicht gesehen habe.
Das wirst du ohne eine ausgeklügelte Lib nicht hinbekommen. Bedenke: Es gibt in C++ keine class-Dateien, keinen class-Loader und nix. Nur ein ganz simples RTTI. Du musst also vorher eine Menge Logik reinprogrammieren um sowas hinzubekommen.
-
Original erstellt von HumeSikkins:
**
Das wirst du ohne eine ausgeklügelte Lib nicht hinbekommen. Bedenke: Es gibt in C++ keine class-Dateien, keinen class-Loader und nix. Nur ein ganz simples RTTI. Du musst also vorher eine Menge Logik reinprogrammieren um sowas hinzubekommen.**Schade! Ich dachte, der Beitrag von Mr. N ging in die Richtung, dass das mit C++ auch nicht so schwer ist! Da habe ich wohl etwas falsches hineininterpretiert!
-
Hallo,
mit COM oder ähnlichen Technologien ist das alles nicht so tragisch. In Standard-C++ würde man da wohl aber einige Monate dran sitzen