Hilfe bei get und set



  • Hallo zusammen,
    bei meinem Code hab ich folgendes Problem:
    Die Eigenschaften der Klasse gegner hab ich auf private gesetzt,public die get- und setmethoden...
    Leider kommt beim Zugriff auf die private-Eigenschaften immer folgende Fehlermeldung:

    error: lvalue required as left operand of assignment

    Hier mal der Code:

    Die spiel.h:

    class gegner : public QLabel {
       private:
            int xpos;
            int ypos;
            int richtung;
    
       public:
            void setx(int);
            void sety(int);
            int getx();
            int gety();
            void bewege();
            //schuss_gegner * schuss;
            gegner(QWidget * w = 0);  //Destruktor
            ~gegner();  //Konstruktor
    
    };
    
    class spiel : public QLabel {
    ...
    public:
    gegner *g;
    ...
    }
    

    Die spiel.cpp

    spiel::spiel (QWidget * w = 0):QLabel(w){
    ...
    g = new gegner(this);
    ..
    }
    
    //Zugriffsmethoden Setzen der Eigenschaft(set-Methoden)
    void gegner::setx(int x) {
       xpos =x;
    }
    void gegner::sety(int y) {
       ypos =y;
    }
    
    //Zugriffmethode Abfrage der Eigenschaft(get-Methoden)
    int gegner::getx() {
        return xpos;
    }
    int gegner::gety() {
        return ypos;
    }
    
    void spiel::timerEvent(QTimerEvent * event){
    ...
    g->pos().x() = rand() % 1 + 0;  //Fehler!!!!!!
    ...
    }
    

    Hoffe auf eure Hilfe

    Gruß


  • Administrator

    Und wieso zeigst du uns nicht, wie die Funktion pos() und x() aussehen? Deine Getter und Setter werden bei der Fehlerzeile gar nie aufgerufen.

    Aber ich vermute mal:

    vector2d gegner::pos();
    
    int vector2d::x();
    

    x() liefert somit eine Kopie zurück. Diese Kopie ist temporär und an diese kannst du nichts zuweisen.

    Grüssli


  • Mod

    Ich sehe nirgendwo, was pos() oder x() sein sollen. Von der Fehlermeldung her würde ich aber mal vermuten, dass diese keine Referenz zurückgeben. Du benutzt sie aber so, als könnte man ihnen etwas zuweisen.

    edit: 15 Sekunden zu langsam... 😞



  • gegner hat ja auch gar keine funktion pos !?

    der code sieht aber so und so etwas chaotisch aus - wieso besitzt spiel einen pointer auf gegner?

    bb

    btw: Du hast Konstruktor und Destruktor verwechselt(zumindest bei den Kommentaren) ;o)



  • Was soll diese Zeile überhaupt?
    Was soll x da sein?

    Ich denke du willst eher das hier:

    g->pos().setx( rand() % 1 + 0 );
    


  • Stimmt,verwechslung rückgängig gemacht;)

    Aber auch Fehler von mir, dass die Fehlercodezeile falsch ist...
    Sie sieht eigendlich so aus:

    g->getx() = rand() % 1 + 0;  //Fehler!!!!!!
    

    Hoffe das hilft vllt weiter!!



  • Die Lösung hat drakon schon gepostet ;o)


  • Administrator

    unskilled schrieb:

    Die Lösung hat drakon schon gepostet ;o)

    Zumindest fast und die Antwort von SeppJ und mir trifft hier auch zu. Man kann einer temporären Variable nichts zuweisen.

    Grüssli



  • Vielen Dank....hat auch schon geklappt bei allen Klassen 🙂

    Nur bei einer noch nicht ganz...ich poste mal den Code...
    leider bringt er schon folgende Fehlermeldung bei der get-Methode...

    error: conversion from 'QObject*' to non-scalar type 'QObject' requested

    spiel.h

    class spiel : public QLabel {
       private:
           int xpos;
           int ypos;
           int richtung;
           int myTimerId;
           schiff * s;
           highscore * h;
           schuss * su;
           gegner *g;
           QObject * myApp;  //das hier!!
           int i;
           QString str;
    
       public:
          QObject getobject();
          spiel (QWidget * );  //Konstruktor
          ~spiel();  //Destruktor
          QVector<gegner *> vector_gegner;
          QVector<schuss_gegner *> vector_schuesse;
          void  keyPressEvent(QKeyEvent *event);
          void  showEvent(QShowEvent * event);
          void  timerEvent(QTimerEvent * event);
          void  hideEvent(QHideEvent * event );
          void  keyReleaseEvent( QKeyEvent *event);
    };
    

    spiel.cpp

    QObject spiel::getobject() {
        return myApp;
    }
    

    main.cpp

    ...
    s->myApp = (QObject *)&app;
    ...
    


  • QObject spiel::getobject() // <-- soll ein QObject zurückgeben
    {
        return myApp; // myApp ist ein QObject*
    }
    


  • Und bevor du in weitere Probleme reinrennst:
    QObject kann man nicht kopieren. Gib einen Pointer zurück, dann wird alles laufen.



  • Danke...Änderungen bei spiel.cpp und spiel.h bezgl. des Pointers wurden gemacht...
    Methode funzt...
    Nur leider bekomm ich es bei der main.cpp nicht hin...



  • Mr.Burns schrieb:

    Nur leider bekomm ich es bei der main.cpp nicht hin...

    Wenn du noch etwas konkreter wirst, können wir dir vielleicht sogar helfen. 😉



  • ok ich versuchs 🙂

    die aktuelle spiel.h

    class spiel : public QLabel {
       private:
           int xpos;
           int ypos;
           int richtung;
           int myTimerId;
           schiff * s;
           highscore * h;
           schuss * su;
           gegner *g;
           QObject * myApp;
           int i;
           QString str;
    
       public:
          QObject *getobject();
          spiel (QWidget * );  //Konstruktor
          ~spiel();  //Destruktor
          QVector<gegner *> vector_gegner;  //dynamisches Array gegner
          QVector<schuss_gegner *> vector_schuesse;  //dynamisches Array schuesse
          void  keyPressEvent(QKeyEvent *event);
          void  showEvent(QShowEvent * event);
          void  timerEvent(QTimerEvent * event);
          void  hideEvent(QHideEvent * event );
          void  keyReleaseEvent( QKeyEvent *event);
    };
    

    spiel.cpp

    QObject* spiel::getobject() {
        return myApp;
    }
    

    Der Fehler kommt bei der main.cpp:

    s->myApp = (QObject *)&app;
    

    error: 'QObject* spiel::myApp' is private

    Fehlermeldung ist klar...nur wie schreib ich es um in der main.cpp,dass es passt?

    Gruß



  • Für was denn das eigentlich?
    Es gibt
    😉 QApplication::instance()
    😉 qApp Macro
    um an das QApplication-Objekt zu gelangen. Warum also extra setzen?

    Zum Problem: Die Fehlermeldung sagt doch alles. Entweder machst du myApp public, oder du bietest eine Funktion "spiel::setMyApp(QObject* o)" an, um das Object zu setzen. Was du aber, wie bereits gesagt, gar nicht brauchst, wenn es dir nur um das QApplication geht.


  • Administrator

    @Mr.Burns,
    Wieso programmierst du im übrigen mit Qt, wenn du anscheinend noch nicht mal richtig C++ beherrschst? Wäre es nicht klüger, zuerst richtig C++ zu lernen?

    Grüssli



  • Danke mit der set-Methode hab ichs hinbekommen!!

    void spiel::setMyApp(QObject* o) {
         myApp = o;
    }
    

    und:

    s->setMyApp((QObject *)&app);
    

    Warum Qt? gezwungenermaßen 😉



  • Wozu der C-Cast?


Anmelden zum Antworten