Value Class - Member initialisieren?



  • Hallo,
    ich habe eine Value class, mit einem __int8 Member. Dieser soll mit 80 initialisiert werden. Nur wie?
    Konstruktoren gehen ja leider nicht.



  • Keine Idee/Lösung?



  • Wieso gehen Konstruktoren nicht?



  • value class...
    Ich kriege da einen Fehler von wegen besonderen Memberfunktionen...



  • ich hatte noch nie ein Problem mit

    public value class Test
    {
    public:
        Test(/* evtl. Argumente*/)
        {
            ...
        }
        .
        .
        .
    };
    

    Ist das nicht nach deinen Vorstellungen?



  • Doch, aber bei folgendem Code:

    public value struct Farbe {
    	System::Drawing::Color color;
    	__int8 Addition;
    
    	Farbe() {
    		Addition = 80;
    	}
    	__int32 ToInt();
    	void FromInt(__int32 Col);
    	void Draw(System::Drawing::Graphics^ g, __int8 Zoom, System::Drawing::Point Pos);
    	Brush^ GetBrush(System::Drawing::Rectangle Rect);
    };
    

    erhalte ich folgenden Fehler:

    error C3417: "Farbe::Farbe(void)": Werttypen können keine benutzerdefinierten speziellen Memberfunktionen enthalten.
    1>ColorField.cpp
    


  • Dochnicht.

    Shullbit:
    Mein Vorschlag war:

    Mr X schrieb:

    __int8 Addition = 80;
    


  • Das geht nur bei statischen Membern.



  • __int8 ist nicht teil von .net und kann somit nicht member einer cli klasse sein..
    Probier das mit System::Int16/32/64...
    Oder liege ich da falsch?



  • Natürlich kann __int8 Member einer .Net-Klasse sein. Wenn ich es durch System::Byte ersetze, kommt übrigens der selbe Fehler



  • Value-Typen können keine parameterlosen Konstruktoren haben.
    Grund: die Runtime kann nicht garantieren, dass so ein Konstruktor immer aufgerufen würde.

    Bei Value-Typen musst du immer sicherstellen, dass Zero-Initialization zu einem "gültigen" Objekt führt.

    Was du unter "gültig" verstehst ist natürlich deine Sache. Gemeint ist: du musst damit rechnen, dass es solche Objekte geben kann, und dass du eventuell eins übergeben bekommst. Bzw. Member-Funktionen drauf aufgerufen werden.

    Falls du zu dem Thema im Netz suchen willst, hier die relevanten Fehlermeldungen (und Fehlercodes) des C# Compilers:

    error CS0573: 'Foo.Bar.i': cannot have instance field initializers in structs
    error CS0568: Structs cannot contain explicit parameterless constructors
    


  • Errare humanum est xD
    Hatte schon die Vermutung, dass meine Vermutung falsch sein könnte.. Nun denn, dann halte ich mich mal raus, da ich offensichtlich keine Ahnung habe..



  • Ich habe jetzt eine (ziemlich unschöne, aber wirksame) Funktion eingebaut, die Addition zurückgibt und dabei allerdings die Werte 0 und 80 vertauscht...

    Aber Danke für die Aufklärung, dass/warum Konstruktoren nicht gehen!



  • Konstruktoren gehen schon, bloss keine parameterlosen.



  • Oh, das ist gut zu wissen.
    EDIT: Allerdings wird trotzdem ein Default-Konstruktor generiert, oder?



  • probiers doch einfach aus 😉



  • Habs grad getestet: Es wird ein Default-Ctor erstellt.



  • ja genau bei msdna heißt es zu der fehlermeldung auch:

    Value types cannot contain functions such as a default instance constructor, destructor, or copy constructor.

    statt public value struct kannst du auch value struct schreiben denn struct heißt nichts anderes als das die klasse public ist



  • Was macht man denn, wenn in der value struct ein ref struct als Member deklariert ist (keine Ahnung, ob das Sinn macht)?

    Dann hätte man keine Möglichkeit, die Member im Default-Konstruktor zu initialisieren und es steht nullptr darin.



  • Black_Sheep schrieb:

    ja genau bei msdna heißt es zu der fehlermeldung auch:

    Value types cannot contain functions such as a default instance constructor, destructor, or copy constructor.

    statt public value struct kannst du auch value struct schreiben denn struct heißt nichts anderes als das die klasse public ist

    Du bringst was durcheinander.

    Bei public value struct {} bezieht sich das public nicht auf die Sichtbarkeit der Member, sondern auf die Sichtbarkeit der Types ausserhalb des Assemblies. Die Default Sichtbarkeit (ohne public) wäre hierbei private!

    Tja, C++/CLI ist einfach nicht ISO / ANSI C++...

    Was macht man denn, wenn in der value struct ein ref struct als Member deklariert ist (keine Ahnung, ob das Sinn macht)?

    Dann hätte man keine Möglichkeit, die Member im Default-Konstruktor zu initialisieren und es steht nullptr darin.

    ref struct ist ein Reference Type und kann dann nur mit ^ als Member des value struct sein. Diese Referenz wird mit nullptr initialisiert.

    Simon

    http://msdn.microsoft.com/en-us/library/ms379617(VS.80).aspx


Anmelden zum Antworten