<?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[std::list will nicht mein Freund sein]]></title><description><![CDATA[<p>Es tut mir leid, aber mir viel es schwer einen geeigneten Titel zu finden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Ich habe folgendes Problem. Es existiert folgende Konstellation:</p>
<pre><code class="language-cpp">class a
{
public:
    class b
    {
    private:
        b();
        ~b();
    };

private:
    std::list&lt;b&gt; m_bs;
};
</code></pre>
<p>Zwar soll die Klasse 'b' nach außen zugänglich sein, jedoch soll die Kon- und Deskruktion von Klasse 'a' kontrolliert werden. Ist eigentlich auch zweitranging. Das Problem hier ist jetzt jedenfalls, dass die std::list ebenfalls Kon- bzw. Desktruktor von 'b' aufrufen können muss.</p>
<p>Ich bekomme folglich die Fehlermeldung (MSVC 10.0):</p>
<pre><code>error C2248: 'a::b::~b' : cannot access private member declared in class 'a::b'
</code></pre>
<p>Daher habe ich die Klasse um eine friend Deklaration ergänzt:</p>
<pre><code class="language-cpp">class b
{
private:
    b();
    ~b();
    friend class std::list&lt;b&gt;;
};
</code></pre>
<p>Leider ohne Erfolg. Da der in std::list verwendete std::allocator ebenfalls über seine 'construct' bzw. 'destruct' Methode Zugriff benötigt, habe ich ihn ebenfalls als friend deklariert. Jedoch wieder ohne Erfolg.</p>
<p>Daraufhin habe ich die Stelle, an der der Zugriff erfolgt lokalisiert. Ein Auszug aus der &lt;list&gt; Implementation von Microsoft:</p>
<pre><code class="language-cpp">struct _Node
	{	// list node
	_Nodeptr _Next;	// successor node, or first element if head
	_Nodeptr _Prev;	// predecessor node, or last element if head
	_Ty _Myval;	// the stored value, unused if head

private:
	_Node&amp; operator=(const _Node&amp;);
	};
</code></pre>
<p>Das Problem ist hier die Deklaration von '_Myval'.</p>
<p>Die Frage ist nur, habe ich unter solchen Bedingungen keine Chance die std::list zu benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285057/std-list-will-nicht-mein-freund-sein</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 12:24:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285057.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 12:26:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 12:26:26 GMT]]></title><description><![CDATA[<p>Es tut mir leid, aber mir viel es schwer einen geeigneten Titel zu finden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Ich habe folgendes Problem. Es existiert folgende Konstellation:</p>
<pre><code class="language-cpp">class a
{
public:
    class b
    {
    private:
        b();
        ~b();
    };

private:
    std::list&lt;b&gt; m_bs;
};
</code></pre>
<p>Zwar soll die Klasse 'b' nach außen zugänglich sein, jedoch soll die Kon- und Deskruktion von Klasse 'a' kontrolliert werden. Ist eigentlich auch zweitranging. Das Problem hier ist jetzt jedenfalls, dass die std::list ebenfalls Kon- bzw. Desktruktor von 'b' aufrufen können muss.</p>
<p>Ich bekomme folglich die Fehlermeldung (MSVC 10.0):</p>
<pre><code>error C2248: 'a::b::~b' : cannot access private member declared in class 'a::b'
</code></pre>
<p>Daher habe ich die Klasse um eine friend Deklaration ergänzt:</p>
<pre><code class="language-cpp">class b
{
private:
    b();
    ~b();
    friend class std::list&lt;b&gt;;
};
</code></pre>
<p>Leider ohne Erfolg. Da der in std::list verwendete std::allocator ebenfalls über seine 'construct' bzw. 'destruct' Methode Zugriff benötigt, habe ich ihn ebenfalls als friend deklariert. Jedoch wieder ohne Erfolg.</p>
<p>Daraufhin habe ich die Stelle, an der der Zugriff erfolgt lokalisiert. Ein Auszug aus der &lt;list&gt; Implementation von Microsoft:</p>
<pre><code class="language-cpp">struct _Node
	{	// list node
	_Nodeptr _Next;	// successor node, or first element if head
	_Nodeptr _Prev;	// predecessor node, or last element if head
	_Ty _Myval;	// the stored value, unused if head

private:
	_Node&amp; operator=(const _Node&amp;);
	};
</code></pre>
<p>Das Problem ist hier die Deklaration von '_Myval'.</p>
<p>Die Frage ist nur, habe ich unter solchen Bedingungen keine Chance die std::list zu benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048659</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 13 Apr 2011 12:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 12:28:48 GMT]]></title><description><![CDATA[<p>Öhm, friend class B? In A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048660</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 13 Apr 2011 12:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 12:28:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Zwar soll die Klasse 'b' nach außen zugänglich sein, jedoch soll die Kon- und Deskruktion von Klasse 'a' kontrolliert werden. Ist eigentlich auch zweitranging.</p>
</blockquote>
<p>Naein, das ist erstrangig, der Rest deiner Frage ist zweitrangig. Beschreibe, was du erreichen willst und warum, nicht wie du denkst, dass dieses Ziel erreicht werden könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048661</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 12:28:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 12:29:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Zwar soll die Klasse 'b' nach außen zugänglich sein, jedoch soll die Kon- und Deskruktion von Klasse 'a' kontrolliert werden.</p>
</blockquote>
<p>Dein Code lässt aber std::list die Konstruktion und Destruktion von Objekten der Klasse a kontrollieren.</p>
<p>In diesem Fall musst du Zeiger in der list speichern damit du selber die Konstruktion/Destruktion übernehmen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048662</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 13 Apr 2011 12:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 13:34:07 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Naein, das ist erstrangig, der Rest deiner Frage ist zweitrangig. Beschreibe, was du erreichen willst und warum, nicht wie du denkst, dass dieses Ziel erreicht werden könnte.</p>
</blockquote>
<p>Nun, das habe ich im Endeffekt ja schon getan. Niemand soll 'b's instanziieren können außer 'a'. Warum? Weil es im Produktivcode keinen Sinn ergeben würde.</p>
<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Öhm, friend class B? In A.</p>
</blockquote>
<p>Das macht leider gar keinen Sinn. Was in meinem Beispiel fehlt ist 'friend class a' in 'b', damit 'a' wie von mir erwähnt die Kon- u. Destruktion von 'b' übernehmen kann. Da hier aber nicht relevant, habe ich es weggelassen.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Dein Code lässt aber std::list die Konstruktion und Destruktion von Objekten der Klasse a kontrollieren.<br />
In diesem Fall musst du Zeiger in der list speichern damit du selber die Konstruktion/Destruktion übernehmen kannst.</p>
</blockquote>
<p>Mir ist das durchaus bekannt. Daher wollte ich die std::list als friend deklarieren. Gibt es hier keinen Workaround?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048701</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:10:29 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Mir ist das durchaus bekannt. Daher wollte ich die std::list als friend deklarieren. Gibt es hier keinen Workaround?</p>
</blockquote>
<p>Du willst nie friends haben. friends sind böse.<br />
Workaround habe ich dir schon gesagt. alternativ sind vielleicht die boost::intrusive_list Sachen eher geeignet. Das Problem ist nunmal dass die STL dir konstruktion und destruktion abnimmt - deshalb klappt es nicht so wie du es willst.</p>
<p>Workaround: selber konstruieren/destruieren (sprich Zeiger verwenden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048726</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:13:35 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Nun, das habe ich im Endeffekt ja schon getan. Niemand soll 'b's instanziieren können außer 'a'. Warum? Weil es im Produktivcode keinen Sinn ergeben würde.</p>
</blockquote>
<p>Mein Vorschlag: Vergiss diese Idee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048730</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:13:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:35:10 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Mein Vorschlag: Vergiss diese Idee.</p>
</blockquote>
<p>Du meinst, ich soll den Kon- und Destruktor public machen? Wollte ich eigentlich vermeiden. Wie gesagt, du würdest damit nichts anfangen können, wenn du es selbst deklarierst ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048750</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:45:02 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Mein Vorschlag: Vergiss diese Idee.</p>
</blockquote>
<p>Du meinst, ich soll den Kon- und Destruktor public machen? Wollte ich eigentlich vermeiden. Wie gesagt, du würdest damit nichts anfangen können, wenn du es selbst deklarierst ...</p>
</blockquote>
<p>Und wenn ich dann so ein Objekt erstelle weil mir langweilig ist. Was würde dann passieren? Wäre dann irgendwas kaputt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048758</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:45:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:54:18 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Und wenn ich dann so ein Objekt erstelle weil mir langweilig ist. Was würde dann passieren? Wäre dann irgendwas kaputt?</p>
</blockquote>
<p>Du hättest wertvolle Zeit verschwendet und meine Ehre gekränkt ...<br />
Du hast prinzipiell schon recht. Aber ich deklariere Dinge als private, um meinen Kollegen arbeit zu ersparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048770</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Wed, 13 Apr 2011 14:58:46 GMT]]></title><description><![CDATA[<p>Denkst du dann hoffentlich auch daran, den op= + Copy-CTor private zu machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048773</guid><dc:creator><![CDATA[Stindel]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Thu, 14 Apr 2011 08:24:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Du meinst, ich soll den Kon- und Destruktor public machen? Wollte ich eigentlich vermeiden. Wie gesagt, du würdest damit nichts anfangen können, wenn du es selbst deklarierst ...</p>
</blockquote>
<p>Man kann das erzeugen von Klassen auch dadurch verhindern, das man die Impl nicht zugänglich macht, nicht verteilt.<br />
.... Der Anwender/verwender bekommt dann nur ne Abstrakte Protokollklasse (Interface) zu sehen.<br />
Was soll Dein Project eigentlich werden ? eine Biblio ? oder ne lose Sammlung von c++ Dateien ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049170</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 14 Apr 2011 08:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Thu, 14 Apr 2011 09:46:34 GMT]]></title><description><![CDATA[<p>Stindel schrieb:</p>
<blockquote>
<p>Denkst du dann hoffentlich auch daran, den op= + Copy-CTor private zu machen?</p>
</blockquote>
<p>Nein, denn man soll durch aus Objekte (zwischen-)speichern können.</p>
<p>RHBaum schrieb:</p>
<blockquote>
<p>Was soll Dein Project eigentlich werden ? eine Biblio ? oder ne lose Sammlung von c++ Dateien ?</p>
</blockquote>
<p>Spielt hier eigentlich doch keine Rolle. Die Problematik hatte ich bei der Implementation einer Klasse in einem größeren Projekt meiner Firma.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049212</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Thu, 14 Apr 2011 09:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::list will nicht mein Freund sein on Thu, 14 Apr 2011 10:10:12 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Stindel schrieb:</p>
<blockquote>
<p>Denkst du dann hoffentlich auch daran, den op= + Copy-CTor private zu machen?</p>
</blockquote>
<p>Nein, denn man soll durch aus Objekte (zwischen-)speichern können.</p>
</blockquote>
<p>Tjo, dann hast du ein Problem. Auch zwischengespeicherte Objekte müssen zerstört werden können, wofür der Destruktor bekannt sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049229</guid><dc:creator><![CDATA[Stindel]]></dc:creator><pubDate>Thu, 14 Apr 2011 10:10:12 GMT</pubDate></item></channel></rss>