System::String::default": Die Eigenschaft hat keine set-Methode



  • Hallo zusammen,
    ich möchte einen String umdrehen. Dazu habe ich eine Klasse Stringtools geschrieben:

    ///////// Stringtools.h ////////////////////////////////////////
    #pragma once
    
    ref class Stringtools
    {
    public:
       static System::String^ umdrehen(System::String^ zk)
       {
          System::String^ ergebnis;
          int j=0;
          for(int i=zk->Length-1; i>=0; i--)
          {
             ergebnis[j]=zk[i];  // hier kommt der Fehler
             j++;                // error C3070: "System::String::default": Die 
          }                      // Eigenschaft hat keine set-Methode.
          return(ergebnis);
       }
    };
    //////////// main.cpp ///////////////////
    #include "stdafx.h"
    #include "Stringtools.h"
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
       String^ s = "Marianne";
       Console::WriteLine(Stringtools::umdrehen(s));
       return 0;
    }
    

    Offenbar kann ich nicht einfach Zeichen ergebnis[j]=zk[i] zuweisen. Kann mir jemand weiterhelfen?
    Vielen Dank im Voraus.



  • System::String ist immuatble, d.h. er kann nicht geändert werden.
    Benutze System::Text::StringBuilder um einen String zusammenzusetzen.

    Edit:
    Ausserdem ist ergebnis ein nullptr, du müsstest schon noch ein Objekt erzeugen.



  • Alternativ kannst Du natürlich auch den String in ein Char-Array umwandeln und dann dort alles rumdrehen...

    Alternativ kannst Du natürlich auch Arrray::Reverse verwenden...

    Es sei aber darauf hingewiesen, dass ein umdrehen des Strings nicht ganz trivial ist, wenn man auch Combining-Character beachten will (bzw. dies ja muss, sonst ist die Funktion einfach falsch!)

    int main()
    {
      // Simple example:
      String^ str = "Hallo";
      array<Char> ^ charArray = str->ToCharArray();
      Array::Reverse(charArray);
      System::Windows::Forms::MessageBox::Show("'" + str + "' => '" + gcnew String(charArray) + "'");
    
      // Combining characters: (WRONG)!
      auto str2c = gcnew array<Char> { 'a', 'b', 's', 'a', 0x0308, 'g', 'e', 'n' };  // absägen
      String^ str2 = gcnew String(str2c);
      array<Char> ^ charArray2 = str2->ToCharArray();
      Array::Reverse(charArray2);
      System::Windows::Forms::MessageBox::Show("'" + str2 + "' => '" + gcnew String(charArray2) + "'");  // WRONG!
    
      // Combining characters: (CORRECT)
      auto str3c = gcnew array<Char> { 'a', 'b', 's', 'a', 0x0308, 'g', 'e', 'n' };  // absägen
      String^ str3 = gcnew String(str3c);
      System::Globalization::TextElementEnumerator ^enumerator = System::Globalization::StringInfo::GetTextElementEnumerator(str3);
      auto elements = gcnew System::Collections::Generic::List<String^>();
      while (enumerator->MoveNext())
        elements->Add(enumerator->GetTextElement());
      elements->Reverse();
      System::Windows::Forms::MessageBox::Show("'" + str3 + "' => '" + String::Concat(elements) + "'");  // CORRECT!
    }
    

    Siehe auch:
    http://www.c-plusplus.net/forum/161855-full

    PS: Beispiel um korrektes Reversieren ergänzt

    Siehe auch:
    http://blog.kalmbach-software.de/de/2014/09/16/reverse-string-unicode-aware/



  • Vielen Dank für die prompte und ausführliche Antwort! 🙂


Log in to reply