Ist C++ wirklich so schlecht?



  • 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 😃



  • @Gregor :p 😃



  • ...zeig mal, wie soetwas aussieht!



  • man kann ja den gcc sozusagen in sein programm reinbauen und dann die klassen immer wieder neu kompilieren in den speicher laden und ausführen :D.
    aber mal im ernst wenn ich ein plugin will dann schmeiss ich das in ne dll (oder was enstprechnedes) und die informationen die das programm braucht um das plugin einzusetzen kann ich da ja auch einbauen...


Anmelden zum Antworten