<?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[Const-Correctness Problem]]></title><description><![CDATA[<p>Hi, wer kann mir einen Design Tipp für folgendes Problem geben. Ich habe eine ItemsWidget Klasse die eine WidgetCollection besitzt in der alle Child-Widgets abgelegt werden. Da diese Liste wissen muss wer der Owner ist, bekommt sie das ParentWidget als Weak-Pointer übergeben. Die Collection wird dynamisch von der Function &quot;EnsureItemCollection&quot; erzeugt. Diese gibt es sowohl als const und nicht const. Das Problem was sich daraus ergibt ist die Const-Corectness. Denn die WidgetCollection nimmt nur nicht &quot;const&quot; Widget-Zeiger im Konstruktor an. Allerdings wird in der const EnsureItemCollection ein const SharedPtr übergeben. Jemand eine Idee wie man das elegant lösen könnte?</p>
<pre><code>class WidgetCollection : public Object
{
public:
	ItemCollection(const SharedPtr&lt;Widgets::ItemsWidget&gt;&amp; parent);

     SharedPtr&lt;Widgets::ItemsWidget&gt; _parent;
	Collections::Generic::List&lt;SharedPtr&lt;Object&gt;&gt; _items;
};

class ItemsWidget : public Widget
{
public:
	ItemsWidget();

	SharedPtr&lt;WidgetCollection&gt;&amp; Items();
	const SharedPtr&lt;WidgetCollection&gt;&amp; Items() const;

	SharedPtr&lt;ItemsWidget&gt; SharedFromThis() { ... };
	SharedPtr&lt;const ItemsWidget&gt; SharedFromThis() const { ... };

private:
	SharedPtr&lt;WidgetCollection&gt; _items;
};

void ItemsWidget::EnsureItemCollection()
{
	if (!_items)
	{
		_items = new WidgetCollection(SharedFromThis());
	}
}

void ItemsWidget::EnsureItemCollection() const
{
	if (!_items)
	{
		_items = new WidgetCollection(SharedFromThis());
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/332568/const-correctness-problem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 22:00:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332568.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 May 2015 16:41:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Const-Correctness Problem on Fri, 08 May 2015 16:41:34 GMT]]></title><description><![CDATA[<p>Hi, wer kann mir einen Design Tipp für folgendes Problem geben. Ich habe eine ItemsWidget Klasse die eine WidgetCollection besitzt in der alle Child-Widgets abgelegt werden. Da diese Liste wissen muss wer der Owner ist, bekommt sie das ParentWidget als Weak-Pointer übergeben. Die Collection wird dynamisch von der Function &quot;EnsureItemCollection&quot; erzeugt. Diese gibt es sowohl als const und nicht const. Das Problem was sich daraus ergibt ist die Const-Corectness. Denn die WidgetCollection nimmt nur nicht &quot;const&quot; Widget-Zeiger im Konstruktor an. Allerdings wird in der const EnsureItemCollection ein const SharedPtr übergeben. Jemand eine Idee wie man das elegant lösen könnte?</p>
<pre><code>class WidgetCollection : public Object
{
public:
	ItemCollection(const SharedPtr&lt;Widgets::ItemsWidget&gt;&amp; parent);

     SharedPtr&lt;Widgets::ItemsWidget&gt; _parent;
	Collections::Generic::List&lt;SharedPtr&lt;Object&gt;&gt; _items;
};

class ItemsWidget : public Widget
{
public:
	ItemsWidget();

	SharedPtr&lt;WidgetCollection&gt;&amp; Items();
	const SharedPtr&lt;WidgetCollection&gt;&amp; Items() const;

	SharedPtr&lt;ItemsWidget&gt; SharedFromThis() { ... };
	SharedPtr&lt;const ItemsWidget&gt; SharedFromThis() const { ... };

private:
	SharedPtr&lt;WidgetCollection&gt; _items;
};

void ItemsWidget::EnsureItemCollection()
{
	if (!_items)
	{
		_items = new WidgetCollection(SharedFromThis());
	}
}

void ItemsWidget::EnsureItemCollection() const
{
	if (!_items)
	{
		_items = new WidgetCollection(SharedFromThis());
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2453015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453015</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Fri, 08 May 2015 16:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Const-Correctness Problem on Fri, 08 May 2015 18:24:09 GMT]]></title><description><![CDATA[<p>Ich würde folgendermaßen vorgehen:</p>
<ol>
<li>Die const EnsureItemCollection() verändert das Objekt - sollte daher besser gar nicht existieren.</li>
<li>Die non-const EnsureItemCollection() ebenfalls entfernen - dafür ist ja der Konstruktor da.</li>
<li>Die SharedPtr-Indirektion von _items scheint mir erstmal keinen Sinn zu machen, da ich hier keinen geteilten Besitz sehe - also durch normales Member ersetzen.</li>
<li>In Items() eine Kopie der Liste zurückgeben und nicht eine Referenz. Die großzügige Verwendung von SharedPtr sieht so aus, als würdest du das alles gerne thread-safe haben (dafür brauchst du aber mindestens noch einen Mutex), das machst du dir aber wieder kaputt, wenn du Referenzen auf interne Member nach außen gibst.</li>
<li>Anschließend stellt sich noch die Frage, ob eine Liste wirklich ihren Besitzer kennen muss. Würde ich ohne Kenntnis der Situation erstmal eher mit &quot;nein&quot; beantworten.</li>
</ol>
<p>Also etwa so:</p>
<pre><code>class ItemsWidget : public Widget
{
public:
    ItemsWidget() : _items(this) {...}

    WidgetCollection&gt; Items() const {return _items;}

private:
    WidgetCollection _items;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2453025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453025</guid><dc:creator><![CDATA[aqw]]></dc:creator><pubDate>Fri, 08 May 2015 18:24:09 GMT</pubDate></item></channel></rss>