<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Composite Pattern: Design Frage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Composite Pattern für eine Art GUI System. In Pseudocode in etwa so:</p>
<pre><code class="language-cpp">class GUIElement {
   GUIElement* mParent;

   uint2  mTopLeft;
   uint   mWidth, Height;

public:
   virtual void onParentDimensionsChanged();
};

class GUIPanel : public GUIElement {
   vector&lt;GUIElement*&gt;  mElements;
public:
   void addElement(GUIElement* element);

    virtual void onParentDimensionsChanged() {
       // Eigene Größe anpassen und onParentDimensionsChanged() aller Kinder (mElements) aufrufen
    }
};

class GUILabel: public GUIElement {
public:

    virtual void onParentDimensionsChanged() {
       // Eigene Größe anpassen
    }
};
</code></pre>
<p>Jedes GUIElement hat einen Parent und wenn sich die Dimensionen des Parent geändert haben, wird onParentDimensionsChanged() aufgerufen. Sagen wir z.B. ich habe ein GUIPanel mit 2 GUILabels drinnen und die Dimensionen des GUIPanels ändern sich, dann wird onParentDimensionsChanged() für die beiden GUILabels im GUIPanel aufgerufen.<br />
Ich habe eine Klasse Framework, die einen Zeiger auf einen GUIPanels besitzt. Dieses GUIPanel ist quasi das Root Element der Hierarchie. Das Problem: Diesess Root GUIPanel hat natürlich kein Parent (Parent = NULL).</p>
<p>Sagen wir das Fenster wird resized. Jetz wird Framework::onResize(width, height) aufgerufen und jetzt muss das Root GUIPanel benachrichtigt werden. Das Problem ist nur, in onParentDimensionsChanged() ist für dieses GUIPanel ja mParent NULL und ich weiß nicht, auf was ich resizen soll.<br />
Ich könnte in Framework::onResize() auch per Hand die Member setzen, quasi so:</p>
<pre><code class="language-cpp">Framework::onResize(width, height) {
   mRootGUIPanel-&gt;mWidth = width;
   mRootGUIPanel-&gt;mHeight = height;

   // Jetzt hier über alle Kinder von mRootGUIPanel iterieren und onParentDimensionsChanged() aufrufen.
   // Geht, aber ist unschön, weil ich auf private Member von GUIPanel zugreife

}
</code></pre>
<p>Wie könnte ich das besser lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294141/composite-pattern-design-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 01:04:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294141.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Oct 2011 18:08:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Composite Pattern: Design Frage on Tue, 18 Oct 2011 18:08:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Composite Pattern für eine Art GUI System. In Pseudocode in etwa so:</p>
<pre><code class="language-cpp">class GUIElement {
   GUIElement* mParent;

   uint2  mTopLeft;
   uint   mWidth, Height;

public:
   virtual void onParentDimensionsChanged();
};

class GUIPanel : public GUIElement {
   vector&lt;GUIElement*&gt;  mElements;
public:
   void addElement(GUIElement* element);

    virtual void onParentDimensionsChanged() {
       // Eigene Größe anpassen und onParentDimensionsChanged() aller Kinder (mElements) aufrufen
    }
};

class GUILabel: public GUIElement {
public:

    virtual void onParentDimensionsChanged() {
       // Eigene Größe anpassen
    }
};
</code></pre>
<p>Jedes GUIElement hat einen Parent und wenn sich die Dimensionen des Parent geändert haben, wird onParentDimensionsChanged() aufgerufen. Sagen wir z.B. ich habe ein GUIPanel mit 2 GUILabels drinnen und die Dimensionen des GUIPanels ändern sich, dann wird onParentDimensionsChanged() für die beiden GUILabels im GUIPanel aufgerufen.<br />
Ich habe eine Klasse Framework, die einen Zeiger auf einen GUIPanels besitzt. Dieses GUIPanel ist quasi das Root Element der Hierarchie. Das Problem: Diesess Root GUIPanel hat natürlich kein Parent (Parent = NULL).</p>
<p>Sagen wir das Fenster wird resized. Jetz wird Framework::onResize(width, height) aufgerufen und jetzt muss das Root GUIPanel benachrichtigt werden. Das Problem ist nur, in onParentDimensionsChanged() ist für dieses GUIPanel ja mParent NULL und ich weiß nicht, auf was ich resizen soll.<br />
Ich könnte in Framework::onResize() auch per Hand die Member setzen, quasi so:</p>
<pre><code class="language-cpp">Framework::onResize(width, height) {
   mRootGUIPanel-&gt;mWidth = width;
   mRootGUIPanel-&gt;mHeight = height;

   // Jetzt hier über alle Kinder von mRootGUIPanel iterieren und onParentDimensionsChanged() aufrufen.
   // Geht, aber ist unschön, weil ich auf private Member von GUIPanel zugreife

}
</code></pre>
<p>Wie könnte ich das besser lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2132979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2132979</guid><dc:creator><![CDATA[Mariiyuan]]></dc:creator><pubDate>Tue, 18 Oct 2011 18:08:14 GMT</pubDate></item><item><title><![CDATA[Reply to Composite Pattern: Design Frage on Tue, 18 Oct 2011 18:13:49 GMT]]></title><description><![CDATA[<p>NVI-Idiom:</p>
<pre><code class="language-cpp">class GUIElement
{
    uint width, height;

    virtual void do_resize(uint x, uint y) = 0;

public:
    void resize(uint x, uint y) // nicht virtuell
    {
        width = x;
        height = y;

        do_resize(x, y);
    }
};

class GUIPanel
{
    virtual void do_resize(uint x, uint y)
    {
        do_your_own_stuff(x, y);
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2132982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2132982</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 18 Oct 2011 18:13:49 GMT</pubDate></item></channel></rss>