So ein bisschen verwirrt von array<System::String^> ^TheString ...



  • Ich habe, um meine Visual C++-Kenntnisse zu verbessern, ein Buch aus der Bibliothek meines Vertrauens geliehen. Da ging es aber nicht um die MFC (wie beabsichtigt), sondern um das .NET Framework. Zuerst dachte ich, was für ein Quatsch, aber ich habe es trotzdem gelesen und habe schon einiges verstanden.

    Da ich relativ gut mit C++ auskomme, vorsuche ich so viel wie möglich zu vergleichen, nur für eines bin ich wahrscheinlich zu blöd: Variablenzeiger, oder wie man das nennen will:

    int main(array<System::String^> ^TheString) // Einmal mit .NET
    int main(int argc,char** argv) // Einmal in reinem C++
    

    In C++ ist das ja relativ logisch: ein char ist ein Buchstabe. Ein Zeiger auf char kann mehrere Bytes zugewiesen bekommen, und das nennt man String. Ein Zeiger auf einen solchen Zeiger kann sogar mehrere Strings aufnehmen.

    In .NET? Da hat mir mein Autor was von Verweisen zusammengestammelt, von Arrays und von gcnew. Warum schreibt man nicht:

    int main(array<System::String^^> TheString)
    
    // oder:
    
    int main(array<System::String> ^^TheString)
    
    // statt, wie in meinem Buch
    
    int main(array<System::String^> ^TheString)
    

    Und warum muss man alle .NET-Objekte mit gcnew initialisieren, obwohl man keinen Zeiger (oder Verweis) haben will, sondern nur ein Objekt?



  • Der aus dem Westen ... schrieb:

    Und warum muss man alle .NET-Objekte mit gcnew initialisieren, obwohl man keinen Zeiger (oder Verweis) haben will, sondern nur ein Objekt?

    Darum gehts doch wenn man .NET verwendet... Du bekommst das alles schön verwaltet:
    http://msdn.microsoft.com/en-us/library/te3ecsc8(VS.80).aspx



  • Mag sein, aber ich bin so sehr an C++ gewöhnt, dass mir diese Art der Verwaltung etwas komisch vorkommt. Alles in den Mund gelegt zu bekommen ist schon beinahe wie Visual Basic. Tu dies, tu das, vergiss das ref nicht, Neues Konzept Eigenschaften, Neues Konzept Schnittstellen, Arrays definiert man jetzt anders, Strings werden als Wert übergeben ... nicht sehr systemnah und vor allem erweitert.

    WAS ich gut finde, ist dass die von System::Window::Form -abgeleiteten Klassen Fenster repräsentieren statt diese nur zu verwalten. Aber diese Syntaxregeln (siehe 2 Posts oben) sind mir immer noch ein Rästel.



  • C++/CLI ist ja auch kein C++ mehr im Sinn von C++... Und bei Entwicklungen mit .NET bekommt man eben vieles abgenommen und "in dem Mund gelegt", wem das nicht passt der soll was anderes verwenden. Viele schwören drauf, aber Visual Basic hat ja auch noch nen großen Marktanteil. 😉



  • Könntest du mir dann noch mein Problem oben ansehen? Gibt es einen funktionellen Unterschied zwischen den Parametern?



  • Und warum muss man alle .NET-Objekte mit gcnew initialisieren, obwohl man keinen Zeiger (oder Verweis) haben will, sondern nur ein Objekt?

    Muss man nicht. Du kannst ebensogut auf dem "Stack" allozieren, das Objekt wird danach automatisch zerstört (wenn der Scope endet).

    int main(array<System::String^^> TheString)
    
    // oder:
    
    int main(array<System::String> ^^TheString)
    

    Naja.. ist so weil ist so, per Definition. Weil ein String nicht einfach eine Zeichenkette mit terminierendem Null ist. Ist es bei C++ auch nicht mehr (std::string).
    Edit: Du kannst dir auch sagen, dass das Memory Model von .NET dies nicht zulässt.

    Simon


Anmelden zum Antworten