Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Auf eine fremde Klasse zugreifen

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question Auf eine fremde Klasse zugreifen

    Hi,

    ich würde gerne von Object3 auf Object2 zugreifen können, warum funktioniert das nicht?

    Gruß

    Whitefurrows

    ////////////////////////////////// main() ////////////////////////////////

    #include
    #include
    #include "obj2.h"
    #include "obj3.h"

    int main( int argc, char* argv[] )
    {

    QApplication app(argc, argv);

    Object2 obj2;
    Object3 obj3;

    obj2.addObject3(obj3);

    Object2* pobj2;
    pobj2 = obj3.getObject2();

    QPushButton pbShow(QString::number(pobj2->data["value1"]));
    pbShow.resize(100, 50);

    pbShow.show();
    return app.exec();

    return 0;
    }
    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////// Object1 //////////////////////////////

    #ifndef OBJ1_H
    #define OBJ1_H

    #include

    class Object1
    {
    public:

    Object1();
    virtual~Object1();

    QString getInfo();
    void setInfo(QString info);

    protected:
    QString info;
    };

    #endif

    //--------------------------------------------------------------

    #include "obj1.h"

    Object1::Object1()
    {
    info="InfoText";
    }

    Object1::~Object1(){}

    void Object1::setInfo(QString i)
    {
    info=i;
    }

    QString Object1::getInfo()
    {
    return info;
    }

    //////////////////////////////////////////////////////////////////////////
    ////////////////////////////// Object2 ////////////////////////////////

    #ifndef OBJ2_H
    #define OBJ2_H

    #include "obj1.h"
    #include "obj3.h"

    #include
    #include
    using namespace std;

    class Object2 : public Object1
    {
    public:
    Object2();
    ~Object2();

    void addObject3(Object3 obj3);
    QList lstObject3;
    map data;
    };

    #endif

    //--------------------------------------------------------------

    #include "obj2.h"

    Object2::Object2():Object1()
    {
    data["value1"]=123;
    }

    Object2::~Object2(){}

    void Object2::addObject3(Object3 obj3)
    {
    obj3.setObject2(this);
    lstObject3.append(obj3);
    }

    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////// Object3 //////////////////////////////

    #ifndef OBJ3_H
    #define OBJ3_H

    #include "obj1.h"
    class Object2;

    class Object3 : public Object1
    {
    public:
    Object3();
    ~Object3();

    void setObject2(Object2* obj2);
    Object2* getObject2();

    private:
    Object2* object2;

    };

    #endif

    //--------------------------------------------------------------

    #include "obj3.h"
    #include "obj2.h"

    Object3::Object3():Object1()
    {
    object2=0;
    }

    Object3::~Object3(){}

    void Object3::setObject2(Object2* obj2)
    {
    object2=obj2;
    }

    Object2* Object3::getObject2()
    {
    return object2;
    }

    //////////////////////////////////////////////////////////////////////////

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Vielleicht willst du hier keine Kopie
    Code:
    void addObject3(Object3 obj3);
    Oder du sagst uns, was nicht funktioniert.

    Ciao,
    _

    P.S.: code tags
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question

    Klar sage ich es. Das Programm stürtzt zur Laufzeit bei folgender Stelle ab:

    Code:
    QString::number(pobj2->data["value1"])
    Ich vermute das Problem entsteht hier, aber ich weiß nicht warum und wie ich es ändern kann!?
    Code:
    void Object2::addObject3(Object3 obj3)
    {
    obj3.setObject2(this);
    lstObject3.append(obj3);
    }

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Das ist logisch.
    Der Pointer ist schließlich noch Null.

    Gehen wir es einfach schrittweise durch:
    - im Konstruktor von Object3 initialisierst du object2 auf 0
    - in Object3::getObject2() gibst den Wert dieser Variable zurück.
    - nachdem dieser Wert zu keinem Zeitpunkt in deinem Programm geändert wird, ist er noch immer 0

    Wie ich schon im anderen Posting angedeutet habe, ist der eigentliche Fehler das Erzeugen einer Kopie bei Object2::addObject3()

    Code:
    void Object2::addObject3(Object3 obj3)
    {
    obj3.setObject2(this);
    lstObject3.append(obj3);
    }
    Wenn du dir das ansiehst, was passiert hier?

    Richtig, im temorären (weil ein lokaler Parameter) Objekt obj3 wird "this" zum Wert von "object2"

    Nachdem der Aufruf call-by-value ist, wird nur das temporäre Objekt verändert, dein Ziel ist vermutlich aber die Änderung am übergebenen Objekt, d.h. call-by-value scheidet aus, weil das immer eine Kopie erzeugt

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question

    Hi,

    danke für die tolle Erklärung, aber irgendwie stehe ich immer noch auf dem Schlauch. Es ist richtig, das ich die Änderung am übergebenen Objekt vornehmen möchte. Das bedeutet in Object3 will ich auf die map in Object2 zugreifen können. Das müsste dann etwa so aussehen:

    Code:
    void Object2::addObject3(Object3 obj3)
    {
    	obj3.setObject2(*this);
    	lstObject3.append(obj3);
    }
    aber das funktioniert nicht, kannst du mir sagen wie es geht?

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nein, der Typ des Parameters von Object2::addObject3() ist falsch.

    Das was du jetzt hast, ist call-by-value, d.h. beim Aufruf wird eine Kopie des übergebenen Objektes angelegt und damit arbeitet die Methode. Änderungen haben daher keine Auswirkung auf das übergebene Objekt.

    Entweder wie bei Object3::setObject2() einen Pointer oder eine Referenz benutzen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question

    Ja so hatte ich es uhrsprünglich versucht:
    Code:
    void Object2::addObject3(Object3* obj3)
    aber dann habe ich das Problem, das ich mit
    Code:
    lstObject3.append(obj3);
    nicht in die QList einfügen kann
    Geändert von whitefurrows (03-12-2006 um 22:28 Uhr)

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Den Template Type der Liste anpassen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question

    Ja, habe ich gemacht, aber dann erhalte ich an folgender Stelle

    Code:
    void Object3::setObject2(Object2* obj2)
    {
    	object2=obj2;
    }
    eine Fehlermeldung "Zugriffsverletzung-Schreibposition 0x67011cf8"

    Was kann ich jetzt machen? Ich habe schon X Möglichkeiten versucht, aber ohne Erfolg!

  10. #10
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Question

    Hallo,

    bin fast am verzweifeln, weil ich es nicht hinbekomme, habe schon viele viele Stunden damit verbracht. Habe den Beispielcode angehängt, vielleicht wäre jemand so nett und schaut sich das ganze nochmal an!?

    Gruß

    Whitefurrows

  11. #11
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ich habe mir das nicht lange angeschaut, aber in der main initialisierst du zumindest "obj3" schon mal nicht.

  12. #12
    Registrierter Benutzer
    Registriert seit
    15.05.2006
    Beiträge
    16

    Smile

    Au das war es, vielen vielen Dank!!!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •