Objekte als Parameter



  • Hallo ich hab ein Problem beim kopieren von Objekte als Paramter.

    Im Tutorial stand:

    Werden Objekte an Funktionen oder Memberfunktionen übergeben, so sollte dies in der Regel über Referenzparameter erfolgen. Eine Übergabe per called-by-value sollte soweit wie möglich vermieden werden. Übergeben Sie ein Objekt per called-by-value, so erhält die Funktion, wie auch bei den einfachen Daten, nur eine Kopie des Objekts, d.h. alle Eigenschaften des zu übergebenden Objekts werden in ein temporäres Objekt umkopiert und dieses dann an die Funktion übergeben.. Dies kann je nach Objektgröße erheblich Zeit und Platz auf dem Stack benötigen. Bei einer Übergabe per Referenz entfällt dieser Kopiervorgang.
    
    Innerhalb der aufgerufenen Funktion bzw. Memberfunktion haben Sie dann über den Parameternamen Zugriff auf alle public-Member des übergebenen Objekts. Ist die aufgerufene Funktion eine Memberfunktion die zur gleiche Klasse wie das übergebene Objekt gehört, so hat die Memberfunktion Zugriff auf alle Member, auch auf die private Member, des übergebenen Objekts (siehe nächsten Abschnitt).
    class Window
    {
       ...
    };
    // Funktionsdeklaration
    void DoAny (Window& obj);
    
    // Objekt definieren
    Window myWin;
    int main()
    {
       ...
       // Aufruf der Funktion
       DoAny(myWin);
       ...
    }
    // Funktionsdefinition
    void DoAny (Window& obj)
    {
       ...
       obj.Size (640,480);    // Übergebenes
       obj.Move (0,0);        // Fenster verändern
    }
    
    Den Nachteil den eine Übergabe eines Objekts als Referenzparameter mit sich bringt ist, dass die Funktion oder Memberfunktion das übergebene Objekt eventuell unbeabsichtigt verändern kann. In vielen Fällen kann es aber durchaus sinnvoll sein, dass eine Funktion bzw. Memberfunktion das übergebene Objekt nicht verändern können soll. In diesem Fall übergeben Sie das Objekt als konstante Referenz , so wie nachfolgend an der Funktion DoAny(...) dargestellt. Ein Versuch das Objekt dann innerhalb der Funktion/Memberfunktion zu verändern, führt zu einem Fehler beim Übersetzen des Programms. Dies gilt auch, wenn die Funktion/Memberfunktion eine Memberfunktion des übergebenen Objekts aufruft, die nicht als const-Memberfunktion definiert ist. Der Aufruf einer nicht-const-Memberfunktion würde ja ansonsten wieder eine Veränderung des übergebenen Objekts zulassen (siehe hier).
    class Window
    {
       ...
     public:
       void NonConstMeth();
       void ConstMeth(...) const;
    };
    
    // Normale Funktion mit const-Referenzparameter
    void DoAny (const Window& obj)
    {
       obj.NonConstMeth();   // Aufruf nicht-constMemberfunktion -> FEHLER!
       obj.ConstMeth();      // Aufruf const Memberfunktion -> OK!
    }
    
    // Objekt definieren
    Window myWin;
    // main() Funktion
    int main()
    {
       ...
       // Aufruf der Funktion
       DoAny(myWin);
       ...
    }
    

    [/cpp]

    So wie es im Tutorial steht funktioniert es ja nicht -.-

    Also hab ich es verändert:

    #include <windows>
    #include <iostream>
    using namespace std;
    
    class Window
    {
    
    public:
    int Move (int move_1 , int move_2);
    int Size (int size_1 , int size_2);
    
    };
    
    // Funktionsdeklaration
    void DoAny (Window& obj);
    
    // Objekt definieren
    Window myWin;
    
    int main()
    {
    
       // Aufruf der Funktion
       DoAny(myWin);
    
    }
    
    // Funktionsdefinition
    void DoAny (Window& obj)
    {
    
       obj.Size (640,480);    // Übergebenes
       obj.Move (0,0);        // Fenster verändern
    }
    

    Aber das funktioniert auch nicht besser ...

    [Linker Fehler] Unresolved external 'Window::Size(int, int)' referenced from E:\BORLAND\CBUILDER6\BIN\UNIT1.OBJ
    [Linker Fehler] Unresolved external 'Window::Move(int, int)' referenced from E:\BORLAND\CBUILDER6\BIN\UNIT1.OBJ

    Was mache ich da falsch?



  • hast du die beiden memberfunktionen auch definiert sprich geschrieben wie die was machen?

    weil die erklärung oben und sowas ist alles richtig...
    auch die aufrufe, das einzige was fehlt sind die beiden definitionen zu move und size, bzw zu NonConstMth() und ConstMeth()



  • Ty jetzt funktioniers

    #include <windows>
    #include <iostream> 
    using namespace std; 
    
    class Window 
    { 
    
    public: 
    int Move (int move_1 , int move_2);
    int Size (int size_1 , int size_2);
    
    };
    
    int Window::Move(int move_z1 , int move_z2)
    {
    int erg;
    
    erg = move_z1 + move_z2;
    
    cout<<"Move: "<<erg<<endl;
    }
    
    int Window::Size (int size_1 , int size_2)
    {
    int erg;
    
    erg = size_1 + size_2;
    
    cout<<"Size: "<<erg<<endl;
    
    }
    
    // Funktionsdeklaration 
    void DoAny (Window& obj);
    
    // Objekt definieren
    Window myWin;
    
    int main() 
    { 
    
       // Aufruf der Funktion
       DoAny(myWin);
        system("PAUSE");
    } 
    
    // Funktionsdefinition 
    void DoAny (Window& obj) 
    { 
    
       obj.Size (1,1);    // Übergebenes
       obj.Move (1,1);        // Fenster verändern
    }
    

Anmelden zum Antworten