Seite 1 von 1

Objekte

Verfasst: 14. April 2008 23:02
von shou
Hallo zusammen,

die Lösung ist wahrscheinlich sehr einfach und gehört zu den Grundlagen... aber ich verstehs grad total nich und finde nichts passendes.
Deshalb stelle ich hier kurz die Frage:

Code: Alles auswählen

class ObjektA {
  ObjektB foo;
}

ObjektA::ObjektA() : foo(this) {}


class ObjektB {
  xxx parent;
}

ObjektB::ObjektB(xxx) :  parent(xxx) {}
also ich möchte das in der Variable 'parent' von ObjektB eine Referenz zu ObjektA zeigt.
Damit ich in ObjektB mit z.b. parent->hallo(); Methoden von ObjektA aufrufen kann.
Nur weiß ich nich was ich an den stellen xxx schreiben soll...
kann mir hier jemand auf die Sprünge helfen?

Vielen dank,
lg shou

Verfasst: 15. April 2008 07:55
von PeterLustig
Sowas ist schwer zu realisieren und sollte sowieso nicht gemacht werden. Warum nutzt du nicht einfach das Parent-Child-System von Qt?

Verfasst: 15. April 2008 10:03
von RHBaum
Irgend wie sieht das wirr aus :-)

Ok, B hat nen parent vom Typ A

A hat nen Member vom typ B ?

Nur B ? oder geht irgendwas anderes ?
Ist A wass allgemeineres (abstrakte basisklasse) oder was voll ausgepraegtes ?

Üblicher weisse macht man sowas ueber Basisklassen ....

[cpp]class Widget
{
public:
Widget(Widget * pParent);
// was man sonst noch so braucht ....
private:
std::list<Widget *> childs; // wenn man sowas braucht ...
};

class A : public Widget
{
public:
A(Widget * pParent):Widget(pParent){}
// was man sonst noch so braucht ....
};

class B : public Widget
{
public:
B(Widget * pParent):Widget(pParent){}
// was man sonst noch so braucht ....
};

// Irgendwo dann ....
A p1(NULL);
B p2(&p1);
// geht natuerlich auch dynamisch mit new ....

[/cpp]

Ich weiss echt ned was du modellieren willst ....
wenn parents auch nicht existent sein koennen, arbeitet man besser mit zeiger (NULL values)
Genau so mit childs auch ....

Sei denn du willst definierte "Ungueltigkeits Werte" fuer deine Objekte definieren ....

Ciao ...

Verfasst: 15. April 2008 10:54
von shou
- ich habe ein fenster Objekt mit QT erzeugt.
- ich habe noch eine 2. Klasse für den Programmpart.
- die 2. Klasse soll Methoden des Fensterobjektes aufrufen.
- das fenster Objekt soll Methoden der 2. Klasse aufrufen.
Mein Problem ist es wie ich zwischen diesen beiden Klassen am besten kommunizieren kann. Also erstelle ich doch meine 2. Klasse innerhalb des QT Fenster Objektes und übergebe (this) somit weiß ich den Objektname des Fenster Objektes und kann dort Methoden innerhalb der 2. Klasse aufrufen.
z.b. Methode insertText(); um Text in ein Textfeld zu schreiben.

lg shou

Verfasst: 15. April 2008 13:23
von PeterLustig
Benutz die Signal-Slot-Technologie. Du verbindest in deiner Hauptklasse die Signale mit den Slots deiner Kindklasse. Umgedreht die Signale deiner Kindklasse mit den Slots deiner Hauptklasse.

Verfasst: 15. April 2008 13:28
von shou
ja dazu muss ich aber in der klasse auch einen pointer auf das objekt haben... und genau das ist ja das problem.

Verfasst: 15. April 2008 14:01
von RHBaum
ja dazu muss ich aber in der klasse auch einen pointer auf das objekt haben...
nein musst du eben nicht :-)

Du kannst die Signale/Slots der Objecte auch ausserhalb verbinden .... da wo du sie erzeugst zum bsp ... notfalls kannst du das sogar nach oben "durchreichen" in dem in deiner hirarchie alle die slots implementieren, und im slot nix anderes machen als ein signal aufzurufen ...
dann verbindest immer den slot des erzeugers mit dem signal des grad erzeugtem .... so kann das untere object funktionen an nem Parent (indirekt)aufrufen, das es gar ned kennt ....

WO genau erzeugst denn die fensterklasse, und wo deine Logic-Klasse ?

Ciao ....

Verfasst: 15. April 2008 14:24
von shou
meine fensterklasse in main.cpp also "ganz unten".
wo ich meine logic klasse erzeuge ist eigentlich egal, zur zeit erzeuge ich sie innerhalb der fensterklasse weil ich dachte nur so kann ich eine kommunikation herstellen.
um die slots und signale anlegen zu können muss ich die klasse doch erweitern? mit welcher klasse?

Verfasst: 15. April 2008 14:32
von PeterLustig
Du solltest dir vielleicht doch noch einmal die Tutorials anschauen und die Seiten über das Signal-Slot-System in der Dokumentation.

Verfasst: 15. April 2008 14:33
von RHBaum
um die slots und signale anlegen zu können muss ich die klasse doch erweitern? mit welcher klasse?
Als erstes : rtfm !!! :P
Trolltech gibt sich so viel Muehe gescheite Dokus zu schreiben, und Du ignoriest die einfach. Das ist traurig irgendwie :-)

Aber um deine Frage schon mal vorweg zu beantworten:

Mit einem Makro (QOBJECT) weisst du einem QT eigenen prebuild tool (moccer) an, fuer signale und slots code entsprechenden Code zu generieren.
Also deine Klasse muss von QObject abgeleitet sein, und das QOBJECT Macro in der deklaration stehen haben. Dann nur noch sicherstellen (macht meist eh die IDE) das dein Header durch den moccer laeuft .... und voiala, du kannst wie wild verbinden ^^

Ciao....

Verfasst: 15. April 2008 15:13
von shou
okay danke :)