Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Aggregation, Zeiger, Design...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.08.2008, 20:58 Uhr
hilefoks



Hi,

als Anfänger habe ich noch so einige Design-Probleme und hoffe das mir da jemand auf die Sprünge helfen mag.

Dies ist die Klasse um die es mir geht. Diese Version ist gekürzt, es gibt natürlich Payload und weitere Methoden (addChild, childAt, ...). Ah ja - und ich verwende hier ein wenig Qt, was hoffentlich nicht wirklich stört - sorry. Anyway - es geht bei meiner Frage nicht um Qt.


C++:
class Bar
{
public:
  Bar();

  ~Bar() {
    removeAllChildren();
    while( !m_postings.isEmpty() )
      m_postings.first()
    
    if( m_parent )
      m_parent->m_children.removeOne( this );
  }

  Bar* root() { /*...*/ }
  Bar* parent() { return m_parent; }

  void removeAllChildren() {
    while( !m_children.isEmpty() )
      delete m_children.takeFirst();
  }

  private:
    Bar(const Bar &rhs);
    Bar& operator=(const Bar &rhs);

    Bar *m_parent;
    QList<Bar*> m_children;
};


Diese Klasse funktioniert bei mir so weit und Valgrind meldet mir (mit meiner hoffentlich ausreichenden Test-Methode) auch keine Speicherlecks.

Leider musste ich das Kopieren dieser Klasse verbieten da ich mir zum einen gar nicht sicher bin ob es sinnvoll ist es zu erlauben, zum anderen weiss ich aber auch gar nicht wie ich das "am besten" implementieren soll.

Die Frage die mich aber gerade beschäftigt ist eine ganz andere. Die Klasse Bar soll natürlich auch von einer anderen Klasse verwendet werden. Eine Klasse "Foo" soll also einen Zeiger auf eine Bar halten können (nur auf eine).

C++:
class Foo {
public:
  Bar* bar() { return m_bar; }
  void setBar(Bar *b) { m_bar = b; }

private:
  Bar *m_bar;
};

So einfach kann es natürlich nicht sein, den wenn ein Bar gelöscht wird hält Foo ja immer noch einen (dann wilden) Zeiger. Also brauche ich in Bar wohl eine Methode attachFoo sowie eine weitere detachFoo... am besten private und Foo als friend? ...

Bin ich gerade dabei mich heillos zu verrennen?

MfG,
Hilefoks

PS: Sorry für den nichts-sagenden Titel.
PPS: Und ebenso für die blöden Klassennamen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.08.2008, 16:06 Uhr
hilefoks



Hi,

mh... also meine Idee mit dem attach/detach funktioniert ganz gut.

Was ich aber nicht blicke ist der Kopierkonstruktor/Zuweisungsoperator der Klasse Bar (speziell: was mache ich sinnvollerweise mit dem parent-Zeiger.).

Wäre nett wenn mir da jemand einen Hinweis geben könnte.

MfG,
Hilefoks
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.08.2008, 03:43 Uhr
Lensflare



Um deine Fragen beantworten zu können müsste es schon ein Modell von etwas Konkretem sein.
Das alles hängt nämlich davon ab, was du machen willst oder was du mit dem Klassenmodell abbilden willst.


Zitat:
So einfach kann es natürlich nicht sein, den wenn ein Bar gelöscht wird hält Foo ja immer noch einen (dann wilden) Zeiger. Also brauche ich in Bar wohl eine Methode attachFoo sowie eine weitere detachFoo...


Nicht notwendig, wenn z.B. die Existenz des Foos von Bar abhängt. Wenn also Foo zusammen mit Bar gelöscht wird.



Zitat:

Was ich aber nicht blicke ist der Kopierkonstruktor/Zuweisungsoperator der Klasse Bar (speziell: was mache ich sinnvollerweise mit dem parent-Zeiger.).



Wenn ein Kind, nachdem es kopiert wurde, seine Eltern beibehält, dann:
Ganz einfach den Pointer kopieren.

Wenn aber das Kind, nachdem es kopiert wurde, nicht die selben Eltern haben kann wie das "Original" (aus welchen Gründen auch immer), dann könnte man die Eltern ebenfalls kopieren:
Also eine Kopie von dem Objekt machen, auf das der Pointer zeigt, und dann den Pointer auf das neue Objekt zeigen lassen.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 26.08.2008 um 03:46 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: