<?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[Tree mit unique_ptr?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will einen einfachen Baum erstellen, der sich selbst enthalten kann. Und irgendwie stelle ich mich zu blöd an und/oder weiß nicht genau, ob sich an so einer Struktur jetzt etwas mit C++11 ändert. Ich will ungerne Pointer verwenden bzw. will ich RAII nutzen.</p>
<pre><code class="language-cpp">class Tree // moveable!
{
public:
    std::vector&lt;Tree&gt; children;
};
</code></pre>
<p>Das geht schon Mal nicht, weli Tree zu diesem Zeitpunkt incomplete ist. Also brauche ich wohl leider Zeiger (leider, weil ich nicht so ganz verstehe, wo ich die gebrauchen könnte, schließlich ist der Tree eh moveable, also sind Kopien nicht wirklich nötig, wieso sollte ich also Zeiger nutzen müssen?)</p>
<pre><code class="language-cpp">class Tree
{
public:
    std::vector&lt;unique_ptr&lt;Tree&gt;&gt; children;
};
</code></pre>
<p>Das klappt auch nicht, weil unique_ptr ja auch löschen möchte. Kann er aber nicht, wenn er den Typ nicht kennt, weil er unvollständig ist.</p>
<p>Irgendwie habe ich gerade ein Brett vor dem Kopf. Wie löst man das denn sauber?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314733/tree-mit-unique_ptr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 01:20:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314733.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Mar 2013 11:11:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:11:56 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will einen einfachen Baum erstellen, der sich selbst enthalten kann. Und irgendwie stelle ich mich zu blöd an und/oder weiß nicht genau, ob sich an so einer Struktur jetzt etwas mit C++11 ändert. Ich will ungerne Pointer verwenden bzw. will ich RAII nutzen.</p>
<pre><code class="language-cpp">class Tree // moveable!
{
public:
    std::vector&lt;Tree&gt; children;
};
</code></pre>
<p>Das geht schon Mal nicht, weli Tree zu diesem Zeitpunkt incomplete ist. Also brauche ich wohl leider Zeiger (leider, weil ich nicht so ganz verstehe, wo ich die gebrauchen könnte, schließlich ist der Tree eh moveable, also sind Kopien nicht wirklich nötig, wieso sollte ich also Zeiger nutzen müssen?)</p>
<pre><code class="language-cpp">class Tree
{
public:
    std::vector&lt;unique_ptr&lt;Tree&gt;&gt; children;
};
</code></pre>
<p>Das klappt auch nicht, weil unique_ptr ja auch löschen möchte. Kann er aber nicht, wenn er den Typ nicht kennt, weil er unvollständig ist.</p>
<p>Irgendwie habe ich gerade ein Brett vor dem Kopf. Wie löst man das denn sauber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306069</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:19:48 GMT]]></title><description><![CDATA[<p>Du musst den Destruktor explizit in deiner Implementierungsdatei definieren. Auch wenn er leer ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306072</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:32:13 GMT]]></title><description><![CDATA[<p>Okay, klappt, aber könntest Du das erläutern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306075</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:44:14 GMT]]></title><description><![CDATA[<p>Ist mir selbst schon passiert und ich hab stundenlang nach meinem Fehler gesucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Naja, wenn du den Destruktor nicht deklarierst und definierst, dann erzeugt der Compiler dir den, das sollte ja klar sein.</p>
<p>Aber das macht der halt zum Zeitpunkt, wo er die Klassendefinition zu Ende gelesen hat</p>
<pre><code>class A
{
} // &lt;-- quasi hier
;
</code></pre>
<p>Aber fertig ist er damit eigentlich nocht nicht, denn er kennt damit noch nicht seine gesamte eigenen Definition.</p>
<p>D.h. er will jetzt von sich selbst den Destruktor generieren (kein Problem), aber er weil den vorher schon benutzen, nämlich durch die Definition des unique_ptr.</p>
<p>So würde ichs in etwa erklären, ist zwar falsch, aber legt in etwa die Funktionswese dar.</p>
<p>Gibt so lustige Tabellen im Interwebz, wo drin steht, was ein unique_ptr für was braucht. Sowas z.b.</p>
<pre><code>Complete type rquirements for unique_ptr and shared_ptr

                            unique_ptr       shared_ptr
+------------------------+---------------+---------------+
|          P()           |      I        |      I        |
|  default constructor   |               |               |
+------------------------+---------------+---------------+
|      P(const P&amp;)       |     N/A       |      I        |
|    copy constructor    |               |               |
+------------------------+---------------+---------------+
|         P(P&amp;&amp;)         |      I        |      I        |
|    move constructor    |               |               |
+------------------------+---------------+---------------+
|         ~P()           |      C        |      I        |
|       destructor       |               |               |
+------------------------+---------------+---------------+
|         P(A*)          |      I        |      C        |
+------------------------+---------------+---------------+
|  operator=(const P&amp;)   |     N/A       |      I        |
|    copy assignment     |               |               |
+------------------------+---------------+---------------+
|    operator=(P&amp;&amp;)      |      C        |      I        |
|    move assignment     |               |               |
+------------------------+---------------+---------------+
|        reset()         |      C        |      I        |
+------------------------+---------------+---------------+
|       reset(A*)        |      C        |      C        |
+------------------------+---------------+---------------+
</code></pre>
<p>von <a href="http://stackoverflow.com/questions/6012157/does-stdunique-ptrt-requires-to-know-the-full-t-definition" rel="nofollow">Stackoverflow</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306080</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:51:05 GMT]]></title><description><![CDATA[<p>Super, kapiert, dankeschön! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Jetzt muss ich aber wieder alles über den Haufen werfen, weil mein bescheidener MSVC2010 tatsächlich für vector noch copy-ctor statt move-ctor benötigt -.- (Upgrade wäre toll, aber meine blöde Visual Assist-Lizenz ist abgelaufen [sagt er beim Update immer], also kann ich das Ding nicht für das neue MSVC neu installieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> und ohne VAssist will ich nicht oder ist MSVC12 so gut, dass man das da auch nicht mehr braucht?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306081</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:51:05 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 11:51:43 GMT]]></title><description><![CDATA[<p>Mh?</p>
<p>Unique_ptr und Vector geht eigentlich, für deine Klasse (also den tree) brauchst du deswegen dann noch keinen Copy-C-Tor...</p>
<p>Aber den zu schreiben sollte auch nicht schwer sein, und den Move-C-Tor kriegt man auch ganz gut hin...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306083</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 12 Mar 2013 11:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 12:53:13 GMT]]></title><description><![CDATA[<p>Ne, eigentlich reicht logisch move für vector aus, aber das scheint ab MSVC2010 noch nicht im der STL angekommen zu sein. Meine Klasse hat move-assignment-operator und move-ctor, aber wenn ich das Ding in einen vector stecken möchte, meckert er, dass der copy-ctor private ist (vorher, dass der wegen unique_ptr nicht erzeugt werden kann, dann hab ich ihn explizit gelöscht).</p>
<p>Code:</p>
<pre><code class="language-cpp">class ConvertibleRange
	{
	public:
		struct Group
		{
			typedef std::unique_ptr&lt;ConvertibleRange&gt; RangePtr;

			std::string name;
			RangePtr range;

			Group(std::string name, RangePtr&amp;&amp; range) : name(name), range(std::move(range)) {}
			Group(Group&amp;&amp; other) : name(std::move(other.name)), range(std::move(other.range)) {}
			Group&amp; operator=(Group&amp;&amp; other);

		private:
			Group(Group&amp;);
			Group&amp; operator=(Group&amp;);
		};

		typedef std::vector&lt;Group&gt; Groups;

		// Methods
                ConvertibleRange();
                ConvertibleRange(ConvertibleRange&amp;&amp; other);
                ConvertibleRange&amp; operator=(ConvertibleRange&amp;&amp; other);
                ~ConvertibleRange() {}

            private:
                Groups groups;
            };
</code></pre>
<p>Sorry fürs Einrücken, irgendwie verballert der das...</p>
<p>Edit: geht aber mit boost1_53::vector auch nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Edit:<br />
Und noch den Fehler:</p>
<blockquote>
<p>1&gt;d:\entwicklungsbibliotheken\boost_1_53_0\boost\container\vector.hpp(629): error C2248: &quot;Ranges::ConvertibleRange::Group::operator =&quot;: Kein Zugriff auf private Member, dessen Deklaration in der Ranges::ConvertibleRange::Group-Klasse erfolgte.<br />
1&gt; c:\...\convertiblerange.h(30): Siehe Deklaration von 'Ranges::ConvertibleRange::Group::operator ='<br />
1&gt; c:\...\convertiblerange.h(18): Siehe Deklaration von 'Ranges::ConvertibleRange::Group'<br />
1&gt; d:\entwicklungsbibliotheken\boost_1_53_0\boost\container\vector.hpp(495): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void boost::container::vector&lt;T&gt;::assign&lt;T*&gt;(InIt,InIt,void *)&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=Ranges::ConvertibleRange::Group,<br />
1&gt; InIt=Ranges::ConvertibleRange::Group *<br />
1&gt; ]<br />
1&gt; d:\entwicklungsbibliotheken\boost_1_53_0\boost\container\vector.hpp(491): Bei der Kompilierung der Klassen-template der boost::container::vector&lt;T&gt;::vector(const boost::container::vector&lt;T&gt; &amp;)-Memberfunktion<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=Ranges::ConvertibleRange::Group<br />
1&gt; ]<br />
1&gt; c:\...\convertiblerange.h(88): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::container::vector&lt;T&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=Ranges::ConvertibleRange::Group<br />
1&gt; ]</p>
</blockquote>
<p>Edit: Gut, da fehlen auch noch consts, damit es überhaupt richtige copy-ctor, =-operators sind, aber das ändert ja auch nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306086</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 12 Mar 2013 12:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 13:50:25 GMT]]></title><description><![CDATA[<p>Mh, bei mir (Visual Studio 2012 Ultimate) funktioniert dein Code</p>
<pre><code>#include &quot;xxx.h&quot;

#include &lt;iostream&gt;

int main()
{
	ConvertibleRange cr;

	return 0;
}
</code></pre>
<p>Da du ja nix mit Templates hast sollte alles übersetzt werden und demnach sollten etwaige Fehler auch angezeigt werden.<br />
Das einzige was ich geändert habe ist, dass ich die 3 Konstruktoren der ConvertibleRange definiert habe (also {} dahinter geschrieben habe).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306131</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 12 Mar 2013 13:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Tue, 12 Mar 2013 14:01:40 GMT]]></title><description><![CDATA[<p>Ja, die sind bei mir in der cpp definiert.</p>
<p>An der STL scheint's ja nicht zu liegen, weil boost::vector dieselben Probleme hat. std::list auch, wobei ich dachte, da sei eine Kopie wegen unnötiger Umstrukturierung wirklich egal (aber wegen so einem Zeug wie resize wahrscheinlich nicht).</p>
<p>Aber wenn es nicht an der STL liegt und move eigentlich von MSVC10 unterstützt wird, welches Sprachfeature fehlt denn dann, weswegen die Container alle so einen Mist machen? Ich weiß ja, dass MSVC10 nicht alles kann, aber ich dachte, dass vector&lt;onlyMoveableType&gt; geht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306135</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 12 Mar 2013 14:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Wed, 13 Mar 2013 14:56:19 GMT]]></title><description><![CDATA[<p>Ich verwende auch VS 2010 und hatte nie Probleme mit <code>std::vector&lt;std::unique_ptr&lt;T&gt;&gt;</code> .</p>
<p>Also schreib vielleicht mal ein Minimalbeispiel auf, sodass wir uns sicher sein können, dass der Fehler im gezeigten Code liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306424</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Mar 2013 14:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Wed, 13 Mar 2013 17:01:46 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Gibt so lustige Tabellen im Interwebz, wo drin steht, was ein unique_ptr für</p>
</blockquote>
<p>Da du nicht geklaert hast, was C oder I in der Tabelle bedeuten, haettest du dir auch die Tiparbeit sparen koennen, da man eh zum Link muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306447</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 13 Mar 2013 17:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Wed, 13 Mar 2013 23:32:18 GMT]]></title><description><![CDATA[<p>Complete/Incomplete Definition...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306528</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to Tree mit unique_ptr? on Wed, 13 Mar 2013 23:43:50 GMT]]></title><description><![CDATA[<p>*snip*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306530</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:43:50 GMT</pubDate></item></channel></rss>