copy constructor & operatorfunktion



  • Hallo Profis,

    ich verwende Microsoft Visual C++ Express 2005 und möchte in einer
    Windows-Forms-Anwendnung (hoffe ich habe das richtige Forum gewählt) eine Operatorfunktion verwenden.
    Leider sind meine Versuche bisher fehlgeschlagen und Beiträge zu verwandten
    Themen haben auch zu keinem Erfolg geführt.
    Hier ist mein Beispielprogramm welches mein Problem illustrieren soll:

    public ref class vec : public Form1
            {
            private:
                    double cx;
                    double cy;
            public:
                    vec() {
                            cx = 0;
                            cy = 0;
                    }
                    vec(double x) {
                            cx = x;
                            cy = 0;
                    }
                    vec(double x, double y) {
                            cx = x;
                            cy = y;
                    }
                    //Rueckgabe
    
                    double bcx() {
    
                            return cx;
                    }
                    double bcy() {
    
                           return cy;
                    }
    
    //copy constructer ???? 
    
                    vec(const vec ^v)  {		
                            cx = v->cx;
                            cy = v->cy;
                    }; 
    
    //operatoren: hier sollen die Komponenten zweier vec's einfach komponentenweise addiert werden
            //vec operator+(const vec^ v) {
            //      vec res(cx+v->cx,cy+v->cy);
            //      return res;
            //      }
    
            };
    
    //Funktionsaufruf (button1_Click wurde andernorts in der Klasse Form1 definiert)
    
    void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) {
          vec v1(1.00,1.00);
          vec v2(2.00,2.00);
        //vec v3();
        //v3 = v1 + v2;  //das haette ich gern
    }
    

    Sobald ich die "//" vor den Zeilen welche die Operatorfunktion definieren entferne kommt folgende Fehlermeldung:

    ....\Form1.h(123) : error C3073: "test::vec": Die Verweisklasse hat keinen benutzerdefinierten Kopierkonstruktor.

    Ich würde gern eine Addition zweier "vec" vornehmen können, wobei
    die Addition als solche komponentenweise erfolgt.
    (v1.cx+v2.cx,v1.cy+v2.cy);
    Ich würde mich sehr freuen wenn jemand einen Vorschlag für eine funktionierende Operatorfunktion machen könnte.

    MfG



  • Hoste deinen Quellcode bitte noch mal, aber in einer Code Einbettung (Button Code für Anfang und nochmal für Ende). Dann bleibt auch die Strukturierung (einrückungen) erhalten.



  • Der Rückgabewert bei dem operator+ soll natürlich auch vec^ sein und das Ergebnis muss mit gcnew erzeugt worden sein. Dann wird auch der copy ctor nicht benötigt.

    Ausserdem solltest Du dir dein Design mal überlegen. Ein Vektor ist keine Form!

    Simon



  • Hallo Simon,

    vielen Dank für den Tipp. Ich habe diesen mal versucht umzusetzen.
    Hier ist das Ergebnis:

    //	vec operator+(const vec^ v) {
    
    	//res = gcnew vec^(cx+v->cx,cy+v->cy); //version 1		
    	//vec^ res(cx+v->cx,cy+v->cy);         //version 2
    			return res;
    //	}
    

    Die Fehlermeldung für Version 1 sieht so aus:

    Fehler Version1:
    .....test\Form1.h(123) : error C2065: 'res': nichtdeklarierter Bezeichner
    .....test\test\Form1.h(123) : error C3698: "test::vec ^": Dieser Typ kann nicht als Argument von "gcnew" verwendet werden.
    Meinten Sie "test::vec" (ohne ''^'' auf oberster Ebene)?

    Fehler Version 2:

    .....test\Form1.h(124) : error C2078: Zu viele Initialisierungen
    .....test\Form1.h(124) : error C2440: 'Initialisierung': 'double' kann nicht in 'test::vec ^' konvertiert werden
    Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    Es ist keine Standardkonvertierung von der mittels Boxing geschachtelten Form des arithmetischen Typs in den Zieltyp vorhanden.
    .....test\Form1.h(125) : error C2440: 'return': 'test::vec ^' kann nicht in 'test::vec' konvertiert werden

    Vielleicht ist es mir nicht gelungen die Vorschläge richtig umzusetzen ?

    MfG



  • Ich habe hier ein kleines Bsp. gemacht:

    using namespace System;
    
    ref class Number
    {
    public:
    	Number(long value)
    		: _value(value)
    	{}
    
    	Number^ operator+(Number^ other)
    	{
    		return gcnew Number(_value + other->_value);
    	}
    
    private:
    	long _value;
    };
    
    int main(array<System::String ^> ^args)
    {
        Number^ n = gcnew Number(27);
    	Number^ m = gcnew Number(28);
    	Number^ s = m + n;
    
        return 0;
    }
    

    Simon

    BTW:
    1. Benutze die cli, nicht die cpp Tags.
    2. Entferne das Häckchen bei "BBCode in diesem Beitrag deaktivieren"



  • Hallo Simon,

    vielen Dank für das Beispiel. Ich habe es folgendermaßen umgesetzt:

    // operator für "vec" Klasse
    	vec^ operator+(const vec^ v) {
    
    				return gcnew vec(cx + v->cx,cy + v->cy);
    	}
    
    // Aufruf in der Funktion "button1_Click"
    vec^ v1 = gcnew vec(1.00,1.00);
    vec^ v2 = gcnew vec(2.00,2.00);
    vec^ v3 = v1 + v2;
    

    Das ganze funktioniert nun wunderbar.

    MfG


Anmelden zum Antworten