none
Zuweisungsoperator bei ref class RRS feed

  • Frage

  • Hallo!

    Wie kann ich meiner ref class einen Zuweisungsoperator hinzufügen.
    So wie ich einfach der String Klasse einen Text zuweisen kann,
    so möchte ich meiner Klasse einen int zuweisen können.

    Was muss ich denn bei C++/CLI beachten?

    Danke für jede Hilfe.

    Gruß Lars

    Montag, 5. Juli 2010 13:10

Antworten

  • Halllo lziegler!

    Jedoch gehen durch das Neuerzeugen im Operatoren eventuelle anderen Werte verloren!
    Wie funktioniert denn da jetzt das Kopieren weiterer Membervariablen?

    Ich glaube Du hast es immer noch nicht ganz verstanden.... eine Zuweisung erzeugt ein neues Objekt... (PUNKT).

    Wenn Du ein Objekt ändern willst, darfst Du keine Zuweisung verwenden!

    Verwende also einen der Folgenden Operatoren:
     +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=


    Jochen Kalmbach (MVP VC++)
    • Als Antwort markiert Lamizi Mittwoch, 7. Juli 2010 10:17
    Dienstag, 6. Juli 2010 12:58

Alle Antworten

  • Hallo lziegler!

    Wie kann ich meiner ref class einen Zuweisungsoperator hinzufügen.
    So wie ich einfach der String Klasse einen Text zuweisen kann,
    so möchte ich meiner Klasse einen int zuweisen können.
    Was muss ich denn bei C++/CLI beachten?

    Meinst Du sowas?

    using namespace System;
    public ref class Foo
    {
    public:
        static operator Foo^(int val)
        {
            Foo^ inst = gcnew Foo();
            inst->_data = val;
            return inst;
        }
        virtual String^ ToString() override
        {
            return _data.ToString();
        }
    
    private:
        int _data;
    };
    
    int main()
    {
        Foo^ bar = 12;
        Console::WriteLine(bar);
    }

    Jochen Kalmbach (MVP VC++)
    Montag, 5. Juli 2010 14:07
  • Hallo Jochen!

    Du hast meine schlecht gestellte Frage perfekt interpretiert! Super, Danke!
    Genau das habe ich gemeint.

    Gibt es jetzt jedoch noch eine Möglichkeit, nicht jedes mal eine neue Instanz mit
    Foo^ inst = gcnew Foo(); anzulegen?
    Oder noch besser, nur dann wenn das Handle noch nicht instanziert wurde?

    In meinem Programm wird die Klasse zum Auswerten von Rückgabewerten einer API verwendet.
    Es wäre ja dann nicht jedes Mal ein gcnew notwendig, sondern nur bei erster Zuweisung.

    Vielen Dank!

    Gruß Lars

     

     

    Dienstag, 6. Juli 2010 05:59
  • Halllo lziegler!

    Gibt es jetzt jedoch noch eine Möglichkeit, nicht jedes mal eine neue Instanz mit
    Foo^ inst = gcnew Foo(); anzulegen?
    Oder noch besser, nur dann wenn das Handle noch nicht instanziert wurde?

    Wie soll dass bei einer Zuweisung gehen?
    Eine Zuweisung* ersetzt das Object...

    Dann musst Du eher sowas wie "+" oder so verwenden...
    Das verändert das Object...


    Jochen Kalmbach (MVP VC++)
    Dienstag, 6. Juli 2010 07:07
  • Hallo Jochen,

    wird dann bei einem String^ auch jedes Mal das Objekt ersetzt? 

    String^  Test;
    Test = "Hallo Welt";
    Test = "Neuer Text!"

    In C++ hatte ich das so realisiert, dass ich in der Klasse noch Einstellungen
    treffen konnte, wie sie sich verhalten soll wenn per operator= ein neuer Wert
    zugewiesen wurde.

    Ich wollte jetzt das gleiche Erreichen. Habe es schon mit einer Property.
    Wollte jedoch den gleichen Syntax erreichen wie früher.

    CMyError^  err = gcnew CMyError(THROW_ON_ERROR);
    
    err = ApiFunction1();
    err = ApiFunction2();
    

    Oder ist es besser, eine Value-Class zu verwenden?

    Gruß Lars

    Dienstag, 6. Juli 2010 07:45
  • Hallo lziegler!

    wird dann bei einem String^ auch jedes Mal das Objekt ersetzt?

    Genau.

    In C++ hatte ich das so realisiert, dass ich in der Klasse noch Einstellungen
    treffen konnte, wie sie sich verhalten soll wenn per operator= ein neuer Wert
    zugewiesen wurde.

    Du kannst auch die ganz "normalen" C++ operatoren verwenden; die sind dann aber nur in C++/CLI erreichbar und nicht in C#/VB.NET

    Vielleicht hilft Dir ja das weiter:
    http://www.codeguru.com/forum/archive/index.php/t-390322.html
     > Oder ist es besser, eine Value-Class zu verwenden?

    Ich kennen Deine Anforderungen nicht, deswegen ist das schwierig zu entscheiden...


    Jochen Kalmbach (MVP VC++)
    Dienstag, 6. Juli 2010 08:21
  • Hallo Jochen,

    meine Anforderungen sind die, dass ich eine C-Api zum Steuern eines Programms habe.
    Für meinen Kollegen, welcher in C# programmiert, stelle ich nun eine Bibliothek bereit.

    Programmiere schon einige Zeit in C++. Stelle aber fest, dass es mit C++/CLI doch einige Fragen gibt.

    Die Klasse, über die wir hier reden, soll eigentlich nur einen Integer-Wert aufnehmen,
    welcher aus der Api zurückgegeben wird. Des Weiteren will ich Optionen einstellen, wie
    sich die Klasse beim Erhalt des Rückgabewerts verhält.

    Ich habe mir jetzt eine ref class und eine value class erzeugt.
    In C# muss ich aber trotzdem die value class mit new instanzieren.

    Kann ich dann zusammenfassend sagen, dass ich bei Interoperabilität mit anderen Sprachen
    immer auf eine ref class gehe?

    Gruß Lars

    Dienstag, 6. Juli 2010 09:20
  • Hallo lziegler!

    Kann ich dann zusammenfassend sagen, dass ich bei Interoperabilität mit anderen Sprachen
    immer auf eine ref class gehe?

    Nee... Wenn Du ein Referenz-Objekt haben willst, dann musst Du ein "ref" verwendnen.
    Wenn Du willst, dass bei jeder Zuweisung die Werte/Inhalte Deiner Klasse kopiert werden, so verwende ein "value".


    Jochen Kalmbach (MVP VC++)
    Dienstag, 6. Juli 2010 09:32
  • Okay Jochen,

    dann will ich eine "value class"! :-)
    Wie kann ich dann dort meiner Klasse den int zuweisen?

    Zuweisungsoperatoren gibt es ja nicht für value class? Oder?

    Gruß Lars

     

    Dienstag, 6. Juli 2010 11:07
  • Hallo lziegler!

    dann will ich eine "value class"! :-)
    Wie kann ich dann dort meiner Klasse den int zuweisen?

    Zuweisungsoperatoren gibt es ja nicht für value class? Oder?

    Da diese "Klassen" ja eh kopiert werden, musst Du einfach einen entsprechenden Konstruktor (wie in meinem ersten Fall) verwenden...

    =>  static operator Foo^(int val)

    Greetings
      Jochen


    Jochen Kalmbach (MVP VC++)
    Dienstag, 6. Juli 2010 11:27
  • Vielen Dank erstmal für Deine Geduld!

    Ich glaube, ich drehe mich total im Kreis. Hier mal mein Tageswerk:
    In C# will ich folgendes haben (siehe Kommentare)

    namespace TestCS
    {
      class Program
      {
        static void Main(string[] args)
        {
          int Wert;
          Wert = 55;
          Console.WriteLine(Wert.ToString());
    
          MyValue1 Value1;
          Value1.m_Value = 44; //Membervariable soll private werden
          Value1 = 44; //FEHLER! Das sollte so gehen
          Wert = Value1; //Wäre schön, wenn das auch noch gehen würde
          Console.WriteLine(Value1.ToString());
        }
      }
    }

    Das ist, was ich in C++ geschrieben habe:

    public value class MyValue1
    {
    public:
    	int	m_Value;
    
    	static operator MyValue1^(int val)
    	{
    		MyValue1^ inst = gcnew MyValue1();
    		inst->m_Value = val;
    		return inst;
    	}
    
    	virtual String^ ToString(void) override
    	{
    		return "Value: " + m_Value;
    	}
    };

    Danke!

    Gruß Lars

     

    Dienstag, 6. Juli 2010 11:49
  • hallo lziegler!
     > static operator MyValue1^(int val)

    Du hast ja jetzt eine "value class"!!! Also entferne das "^"!

    using namespace System;
    
    public value struct Foo
    {
        static operator Foo(int i)
        {
            Foo f;
            f._value = i;
            return f;
        }
    private:
        int _value;
    };
    
    int main()
    {
        Foo f;
        f = 12;
    }

    Jochen Kalmbach (MVP VC++)
    Dienstag, 6. Juli 2010 12:08
  • Okay, so weit so gut!
    Jedoch gehen durch das Neuerzeugen im Operatoren eventuelle anderen Werte verloren!
    Wie funktioniert denn da jetzt das Kopieren weiterer Membervariablen?

    Gruß Lars

    Dienstag, 6. Juli 2010 12:41
  • Halllo lziegler!

    Jedoch gehen durch das Neuerzeugen im Operatoren eventuelle anderen Werte verloren!
    Wie funktioniert denn da jetzt das Kopieren weiterer Membervariablen?

    Ich glaube Du hast es immer noch nicht ganz verstanden.... eine Zuweisung erzeugt ein neues Objekt... (PUNKT).

    Wenn Du ein Objekt ändern willst, darfst Du keine Zuweisung verwenden!

    Verwende also einen der Folgenden Operatoren:
     +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=


    Jochen Kalmbach (MVP VC++)
    • Als Antwort markiert Lamizi Mittwoch, 7. Juli 2010 10:17
    Dienstag, 6. Juli 2010 12:58