PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auf eine fremde Klasse zugreifen



whitefurrows
02-12-2006, 14:41
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;
}

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

anda_skoa
02-12-2006, 20:05
Vielleicht willst du hier keine Kopie


void addObject3(Object3 obj3);


Oder du sagst uns, was nicht funktioniert.

Ciao,
_

P.S.: code tags

whitefurrows
03-12-2006, 02:22
Klar sage ich es. Das Programm stürtzt zur Laufzeit bei folgender Stelle ab:


QString::number(pobj2->data["value1"])

Ich vermute das Problem entsteht hier, aber ich weiß nicht warum und wie ich es ändern kann!?

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

anda_skoa
03-12-2006, 15:15
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()



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,
_

whitefurrows
03-12-2006, 16:12
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:


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

aber das funktioniert nicht, kannst du mir sagen wie es geht?

anda_skoa
03-12-2006, 22:07
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,
_

whitefurrows
03-12-2006, 22:25
Ja so hatte ich es uhrsprünglich versucht:

void Object2::addObject3(Object3* obj3)
aber dann habe ich das Problem, das ich mit

lstObject3.append(obj3);
nicht in die QList einfügen kann

anda_skoa
04-12-2006, 15:36
Den Template Type der Liste anpassen

Ciao,
_

whitefurrows
08-12-2006, 08:20
Ja, habe ich gemacht, aber dann erhalte ich an folgender Stelle


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!

whitefurrows
02-01-2007, 15:25
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

locus vivendi
02-01-2007, 19:22
Ich habe mir das nicht lange angeschaut, aber in der main initialisierst du zumindest "obj3" schon mal nicht.

whitefurrows
10-01-2007, 20:51
Au das war es, vielen vielen Dank!!!