Unterschiede zwischen C++ und C++/CLI



  • C++/CLI ist eine Erweiterung von C++, mit der man Zugriff auf das .NET-Framework und ein paar weitere Sprachfeatures hat. Allerdings wird die Sprache von Microsoft immer weniger unterstützt, der Hauptanwendungszweck von C++/CLI ist Interop.

    hustbaer hat vor einiger Zeit die Thematik recht ausführlich beschrieben, siehe hier.



  • Erstmal danke für alle Antworten 😃 .

    Meiner Meinung nach ist CLI leichter zu lernen, was aber auch daran liegen kann, dass ich mir jetzt ein bisschen schwer tue mich auf C++ ohne .NET umzustellen. Beispielsweise habe ich schon wieder aufs Neue vergessen, wie man eine neue Instanz einer Klasse in C++ erstellt 🙄 . Das ganze zu Mischen halte ich auch für keine gute Idee, da ich mich eben noch nicht sehr gut in C++ auskenne und so die Fehler praktisch schon "vorprogrammiert" sind 😃 .



  • Taeli schrieb:

    Beispielsweise habe ich schon wieder aufs Neue vergessen, wie man eine neue Instanz einer Klasse in C++ erstellt 🙄 .

    Ist doch ganz einfach:

    class foo
    {
        //...
    };
    
    int main()
    {
        foo instance; //und schon hast du ne Instanz erstellt  :D 
    
        //...
    
        return 0;
    }
    

    Und falls du gemeint hast wie man die Instanz auf dem Heap anlegt:

    //Klasse siehe oben
    int main()
    {
        foo *instance = new foo();
    
        //...
    
        delete instance;
        return 0;
    }
    

    EDIT: Fehlerhafte Formatierung korigiert



  • Und dasselbe Beispiel noch in C++/CLI:

    ref class foo
    {
    };
    
    int main()
    {
        foo instance; //und schon hast du ne Instanz erstellt :D
    
        // ...
    
        return 0;
    }
    

    Ist also von der Verwendung in diesem Fall genau gleich. Die Unterschiede machen sich aber bald bemerkbar:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance;
        return 0;
    }
    

    Ich fands immer ganz angenehm.



  • Jonas OSDever schrieb:

    C++ hat auch kein for each,

    Jein. Für die STL wurde for_each implementiert.

    Ergänzung:
    Im neuen Standard gibt es for each auch für andere Datenstrukturen:

    int main()
    {
      int bunny[] = {1,2,3,4,5};
    
      for (int& i: bunny)
        std::cout << i;
    }
    


  • /rant/ schrieb:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance; //<-- ???
        return 0;
    }
    

    Ich dachte in C++/CLI gibt man die Sachen nich mehr selber, dass macht doch der GC?!



  • Ja, der GC kann alles übernehmen. Aber man kann in gewissen Situationen auch mit Auto-Semantik und delete programmieren, wenn man will. Darum mag ich die Sprache. Leider wird sie von Microsoft totgeschwiegen und gekillt.

    😮



  • [Rewind] schrieb:

    Jonas OSDever schrieb:

    C++ hat auch kein for each,

    Jein. Für die STL wurde for_each implementiert.

    Ich bin von Schlüsselwörtern (und falls es foreach bei C++11 gibt: von C++03) ausgegangen. 😉



  • Jonas OSDever schrieb:

    Ich bin von Schlüsselwörtern (und falls es foreach bei C++11 gibt: von C++03) ausgegangen. 😉

    C++-foreach kommt ohne foreach-Schlüsselwort aus 😉



  • Jonas OSDever schrieb:

    /rant/ schrieb:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance; //<-- ???
        return 0;
    }
    

    Ich dachte in C++/CLI gibt man die Sachen nich mehr selber, dass macht doch der GC?!

    delete in C++ und delete in C++/CLI macht nicht dasselbe!
    In C++/CLI wird durch den delete Aufruf die Dispose() Methode aufgerufen (sofern vorhanden)!

    Hier noch was dazu:
    http://www.c-plusplus.net/forum/242975-10



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ja, das ist klar. Es geht um die Semantik. Was in C++/CLI wie ein Destruktor aussieht, wird beim Kompilieren zu einem Dispose + compiler generated Finalizer. Der Operator delete ruft den IDisposable.Dispose auf dem Objekt auf, mit welchem Ressourcen freigegeben werden können. Am Ende gibt es einen Call GC::SuppressFinalize(this), wodurch der GC den Speicher beliebig reclaimen kann, da man die Arbeit ja bereits selbst gemacht hat 😉


Anmelden zum Antworten