Kann Klassenmethode mit eigener Klasse aufgerufen werden?



  • Hallo Com.,
    ich versuche eben von VB nach VC++ umzusteigen und hadere noch ob der Syntax und einigen Spezialitäten, bei denen ihr mir bestimmt helfen könnt.

    Ich habe zunächst eine Klasse definiert, die eine Methode beinhaltet, die ihre eigene Klasse als Paramter akzeptiert. Geht das?

    //in Klasse1.h

    ref class Klasse1
    {
    public:
    int wert;
    int nocheinwert;
    int undnocheiner;

    public:
    void MachWas(Klasse1 ^Kaffee);
    }

    ..
    Die Methode macht dann irgendwas mit wert..
    ..

    //in Klasse1.cpp

    void MachWas(Klasse1 ^Kaffee)
    {
    Kaffee->wert++;
    }

    //Im Hauptprogramm soll jetzt ein Array mit 10 Elementen des Typs Klasse1 definiert werden:

    main()
    {
    array<Klasse1^> ^Kaffee = gcnew (Klasse1^)(10);

    //Dann wird zB Kaffee[0] initialisiert:

    Kaffee[0] = gcnew (Klasse1^);

    //und soll an die eigene Methode als Parameter übergeben werden:

    Kaffee[0]->MachWas(Kaffee[0]);

    Und schon motzt der Compiler. Wo liegt mein (Denk-)Fehler?

    Danke!



  • Falsches Forum.
    Das sieht nach .net aus und ist es wohl auch.



  • isitthatsimple schrieb:

    Und schon motzt der Compiler.

    Das macht der übrigens nicht aus Jux und Tollerei, er spuckt dir auch eine Nachricht aus um dir zu sagen, wo genau der Fehler liegt. Und nicht nur, wo der Fehler liegt, sondern auch, was genau du falsch gemacht hast 😮
    Gesetzt den Fall, du kannst mit der Fehlermeldung nichts anfangen, kannst du sie auch gerne hier posten (samt Angabe, welche Zeile gemeint ist), meistens sagen die nämlich doch eine Menge aus.



  • Zudem solltest du C/C++-Tags verwenden, um den Code zu formatieren. Das ist die erste weisse Schaltfläche unter dem Textfeld, den Code-Teil einfach in [cpp] und [/cpp] einschliessen.

    Das sieht dann so aus:

    int main()
    {
        return 0;
    }
    

    Und was die folgenden Zeilen betrifft, die sind ganz sicher nicht C++:

    array<Klasse1^> ^Kaffee = gcnew (Klasse1^)(10);
    
    ref class Klasse1
    

    Von daher frage ich mich, ob du wirklich C++ meinst. Hast du dazu auch irgendwelche Bücher oder Tutorials gelesen oder versuchst du gerade, Schlüsselwörter von VB durch die von C++ zu ersetzen? Letzteres ist mit Sicherheit eine sehr schlechte Idee.

    C++ sollte man so oder so von Anfang an lernen, unabhängig davon, wie die Vorkenntnisse bei anderen Sprachen aussehen. Sonst kommt es immer wieder zu Problemen, weil man das Konzept von C++ nicht verstanden hat und krampfhaft versucht, Mittel anderer Sprachen hinzubiegen.





  • @Nexus: doch, ganz sicher - fast. Es handelt sich genauer gesagt um Visual C++ 2008. Ich benutze ein -scheiss- Buch von M&T, das ziemlich konfus ist. Sonst würde ich's wohl auch hinbekommen. Ich habe bis jetzt in VBasic gewerkelt, weil mir das einfach fluffiger von der Hand geht (ich weiss, ist ja auch keine echte Programmiersprache .. bla). Leider bin ich jetzt an einem Punkt, an dem ich in VB nicht mehr weiterkomme, weil ich keinen ordentlichen Zugriff auf DirectX habe. Also muss ich mir jetzt C++ reinpacken und den ganzen Müll konvertieren. Isofern liegst Du nicht ganz daneben mit der Vermutung, ich würde versuchen zu konvertieren.

    Die Dachsymbole in der Klasse sind Syntax aus .net, sie sind nicht c++-Notation.

    Aber mal abgesehen von der Syntax, lass uns das Problem weiter abstrahieren:

    **Ich definiere innerhalb einer Klasse eine Methode (nicht statisch).
    **Kann diese Methode dann als Parameter die eigene Klasse benutzen?

    Also zB (ich weiss nicht ob das jetzt vollständig c++-syntaktisch korrekt ist, es geht ja auch nur ums Prinzipielle):

    ref class Klasse1
    {
    public:
    int wert;

    void MachWas(Klasse1 KlassenObj);
    }

    //Die Klasse besteht also aus einem Wert und einer Methode. Die Methode erhält //als Parameter ein Objekt des Typs Klasse1.
    //Die Methode wird dann weiter ausgefüllt, mit irgendwas halt.

    void MachWas(Klasse1 KlassenObj)
    {
    //hier passiert irgendwas
    }

    ..

    //Im Hauptprogramm wird dann ein Objekt Klassenobjekt des Typs Klasse 1 erzeugt,
    // und die Klassenmethode mit diesem Objekt als Argument aufgerufen.

    int main()
    {
    ..
    KlassenObj.MachWas(KlassenObj);
    ..
    }

    Eigentlich sollte das doch gehen. Vermutlich ist es doch ein syntaktisches Problem. 'ne Idee?



  • Benutze bitte C/C++-Tags; wie du das machst, steht in meinem vorherigen Beitrag.

    isitthatsimple schrieb:

    @Nexus: doch, ganz sicher - fast. Es handelt sich genauer gesagt um Visual C++ 2008.

    Visual C++ ist keine Programmiersprache, sondern nur eine Entwicklungsumgebung (IDE), um zu programmieren. 😉

    isitthatsimple schrieb:

    **Ich definiere innerhalb einer Klasse eine Methode (nicht statisch).
    **Kann diese Methode dann als Parameter die eigene Klasse benutzen?
    [...]
    Eigentlich sollte das doch gehen. Vermutlich ist es doch ein syntaktisches Problem. 'ne Idee?

    Ich hab eher das Gefühl, es liegt ein Designproblem vor. Warum soll die Methode ein Objekt der eigenen Klasse aufnehmen? Oder willst du eher ein Zeiger oder eine Referenz?

    Vor allem das

    KlassenObj.MachWas(KlassenObj);
    

    hat doch keinen Sinn. Du kannst innerhalb der Methode automatisch auf das aktuelle Objekt zugreifen, wieso willst du es also explizit übergeben?

    isitthatsimple schrieb:

    Die Dachsymbole in der Klasse sind Syntax aus .net, sie sind nicht c++-Notation.

    Willst du jetzt, dass man dir auf C++-Weise oder C++/CLI-Weise hilft? Bei letzterem bist du im falschen Forum.



  • isitthatsimple schrieb:

    **Ich definiere innerhalb einer Klasse eine Methode (nicht statisch).
    **Kann diese Methode dann als Parameter die eigene Klasse benutzen?

    Jap, wird sogar sehr häufig angewandt! Falls du schon die C++-Referenzen kennst (sind im Prinzip "sichere" Zeiger):

    class A
    {
        public:
            A& operator=( const A& other )
            {
                i = other.i;
                return *this;
            }
    
        private:
            int i;
    };
    

    Diesen Zuweisungsoperator bräuchte man in der Form auch gar nicht implementieren, das macht der Compiler schon automatisch für einen. Wie auch immer, eine Klassen-Methode darf dieselben Parameter entgegennehmen wie alle anderen Funktionen auch - also alles, was es an Typen so gibt.

    edit: Ok, hatte es falsch verstanden, du willst die eigene Klasse übergeben; scheint sich ja aber schon geklärt zu haben 🙂



  • Ich hab eher das Gefühl, es liegt ein Designproblem vor. Warum soll die Methode ein Objekt der eigenen Klasse aufnehmen? Oder willst du eher ein Zeiger oder eine Referenz?

    Das Problem taucht deswegen auf, weil ich ein Array aus den Klassenobjekten erstellt habe und der Compiler darüber meckert. Möglicherweise ist das alles ein Designproblem, auch wenn ich das jetzt so nicht sehe. Um das mal etwas zu konkretisieren: die Klasse ist eine Karte mit Koordinaten. Unter bestimmten Umständen müssen die Koordinaten getauscht/geändert werden. Da das ja irgendwie ud ausschliesslich mit der Klasse selbst zu tun hat, habe ich das als Methode in der Klasse verankert. Nun muss die Methode aber bei jedem Aufruf das komplette Objekt als Argument erhalten, damit .. ich verstehe gerade was Du meinst .-) (<-einäugig, aber nicht blind) Ich brauche ja nix zu übergeben, sondern kann direkt mit der Methode auf den Parametern werkeln.

    Vor allem das

    KlassenObj.MachWas(KlassenObj);
    

    hat doch keinen Sinn. Du kannst innerhalb der Methode automatisch auf das aktuelle Objekt zugreifen, wieso willst du es also explizit übergeben?

    Siehe oben.

    Willst du jetzt, dass man dir auf C++-Weise oder C++/CLI-Weise hilft? Bei letzterem bist du im falschen Forum.

    Egal, Du hast mir auf die Sprünge geholfen! Dafür zunächst mal Danke.

    ..auh wenn das mit der Klasse als Argument noch nicht aus der Welt ist .. 🙂



  • Badestrand schrieb:

    isitthatsimple schrieb:

    **Ich definiere innerhalb einer Klasse eine Methode (nicht statisch).
    **Kann diese Methode dann als Parameter die eigene Klasse benutzen?

    Jap, wird sogar sehr häufig angewandt! Falls du schon die C++-Referenzen kennst (sind im Prinzip "sichere" Zeiger):

    class A
    {
        public:
            A& operator=( const A& other )
            {
                i = other.i;
                return *this;
            }
    
        private:
            int i;
    };
    

    Diesen Zuweisungsoperator bräuchte man in der Form auch gar nicht implementieren, das macht der Compiler schon automatisch für einen. Wie auch immer, eine Klassen-Methode darf dieselben Parameter entgegennehmen wie alle anderen Funktionen auch - also alles, was es an Typen so gibt.

    Ah, genau!! Dann war es also doch ein Syntaxproblem. Man übergibt also nur die Zeiger, und nicht das Objekt selber. Das werde ich doch direkt mal testen!

    Danke 🙂



  • Jetzt verstehe ich nichts mehr. Zum einen sagst du, ich hätte dir die Augen geöffnet, weil man ja das eigene Objekt nicht übergeben muss.

    Nun willst du aber genau dies tun, einfach als Referenz. Ein Parameter mit einer Referenz/einem Zeiger des eigenen Typs hat nur den Sinn, wenn auch andere Argumente als das Objekt, von dem aus die Methode aufgerufen wird, übergeben werden.



  • Nexus schrieb:

    Jetzt verstehe ich nichts mehr. Zum einen sagst du, ich hätte dir die Augen geöffnet, weil man ja das eigene Objekt nicht übergeben muss.

    Nun willst du aber genau dies tun, einfach als Referenz. Ein Parameter mit einer Referenz/einem Zeiger des eigenen Typs hat nur den Sinn, wenn auch andere Argumente als das Objekt, von dem aus die Methode aufgerufen wird, übergeben werden.

    Nee, passt schon. Ich übergebe erstmal nix mehr und sehe mal, wie weit ich komme. Bei Gelegenheit muss ich das mit den Referenzen mal richtig erlernen. Dummerweise ist mein Buch totaler Müll. Hast Du Vorschläge für geeignete Literatur? Bücher mit nachvollziehbaren Beispielen gab's hier im Laden nicht. Und bevor ich wieder Euronen ausgebe, frage ich lieber mal nach.



  • isitthatsimple schrieb:

    ...Vorschläge für geeignete Literatur?

    Ich lerne momentan mit dem Buch "C++ Primer" und meiner Meinung nach ist dort alles sehr gut Beschrieben und zu dem gibt es auch zu beinahe jedem Abschnitt eines Kaptitels und Unterkapitels viele Übungsaufgaben die dabei helfen das gelesene auch anzuwenden und zu verstehen :).



  • Mizar schrieb:

    isitthatsimple schrieb:

    ...Vorschläge für geeignete Literatur?

    Ich lerne momentan mit dem Buch "C++ Primer" und meiner Meinung nach ist dort alles sehr gut Beschrieben und zu dem gibt es auch zu beinahe jedem Abschnitt eines Kaptitels und Unterkapitels viele Übungsaufgaben die dabei helfen das gelesene auch anzuwenden und zu verstehen :).

    Ah ja, hat bei Amazon zumindest nur gute Noten bekommen. Muss ich mal reinschauen. Knapp 30 Tacken ist denn auch nicht zu teuer, wenn's hilft und gut ist. Danke für den Tipp!



  • "Thinking in C++ 1&2" wird auch relativ häufig empfohlen. Die gibt es auch gratis als Online-PDF.


Log in to reply