<?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[PIMPL und Typedef in der versteckten Klasse]]></title><description><![CDATA[<p>Tag zusammen,</p>
<p>ich habe das Problem hier:</p>
<pre><code>// Foo.h
class HiddenFoo;

class Foo
{
	std::unique_ptr&lt;HiddenFoo&gt; m_foo;

public:
	Foo();

	Typed getBar() const; // dieses Typed
};
</code></pre>
<pre><code>// Foo.cpp
#include &quot;HiddenFoo.h&quot;

Foo::Foo()
		: m_foo(new HiddenFoo)
	{}

Typed Foo::getBar() const // dieses Typed
	{
		return this-&gt;m_foo-&gt;getBar();
	}
</code></pre>
<pre><code>// HiddenFoo.h
class HiddenFoo
{
public:
	typedef std::vector&lt;std::map&lt;std::string, std::list&lt;std::vector&lt;std::vector&lt;std::map&lt;std::string, int&gt;&gt;&gt;&gt;&gt; Typed;

private:
	Typed m_x;

	Typed getBar() const
	{
		return this-&gt;m_x;
	}

};
</code></pre>
<p>Ein Standard PIMPL halt, aber ich habe in der weggekapselten Klasse eine komplexeres Typedef (das in dem Beispiel ist maßlos übertrieben). Und dieses brauche ich in der PIMPL-Klasse. Aber wie mache ich das dort sichtbar ohne das PIMPL zu entfernen?</p>
<p>edit: das typedef gekürzt, damits die website nicht umformatiert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314255/pimpl-und-typedef-in-der-versteckten-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 09:48:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314255.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Feb 2013 12:43:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:18:49 GMT]]></title><description><![CDATA[<p>Tag zusammen,</p>
<p>ich habe das Problem hier:</p>
<pre><code>// Foo.h
class HiddenFoo;

class Foo
{
	std::unique_ptr&lt;HiddenFoo&gt; m_foo;

public:
	Foo();

	Typed getBar() const; // dieses Typed
};
</code></pre>
<pre><code>// Foo.cpp
#include &quot;HiddenFoo.h&quot;

Foo::Foo()
		: m_foo(new HiddenFoo)
	{}

Typed Foo::getBar() const // dieses Typed
	{
		return this-&gt;m_foo-&gt;getBar();
	}
</code></pre>
<pre><code>// HiddenFoo.h
class HiddenFoo
{
public:
	typedef std::vector&lt;std::map&lt;std::string, std::list&lt;std::vector&lt;std::vector&lt;std::map&lt;std::string, int&gt;&gt;&gt;&gt;&gt; Typed;

private:
	Typed m_x;

	Typed getBar() const
	{
		return this-&gt;m_x;
	}

};
</code></pre>
<p>Ein Standard PIMPL halt, aber ich habe in der weggekapselten Klasse eine komplexeres Typedef (das in dem Beispiel ist maßlos übertrieben). Und dieses brauche ich in der PIMPL-Klasse. Aber wie mache ich das dort sichtbar ohne das PIMPL zu entfernen?</p>
<p>edit: das typedef gekürzt, damits die website nicht umformatiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301868</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 12:47:05 GMT]]></title><description><![CDATA[<p>Gar nicht, geht nicht. Der Typ muss im Header bekannt sein. Du könntest allerdings einen unique_ptr zurückgeben - dann muss der Typ nur deklariert und nicht definiert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301869</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 25 Feb 2013 12:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 12:50:56 GMT]]></title><description><![CDATA[<p>Das kommt aber aufs gleiche raus, ich muss den gesamten Namen mehr als einmal schreiben.</p>
<p>Derzeitig ists so, dass ich in beiden Klassen jeweils das gleiche typedef drin stehen habe.</p>
<pre><code>class Foo
{
    typedef std::map&lt;....&gt; Typed;

// ...

    Typed getBar() const;
};

class HiddenFoo
{
    typedef std::map&lt;....&gt; Typed;
};
</code></pre>
<p>Gefällt mir nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301873</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 25 Feb 2013 12:50:56 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 12:52:49 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Heißt das der Typ ist gar nicht abhängig von etwas was du verstecken willst? Dann verstehe ich das Problem nicht ehrlich gesagt, pack das typedef in Foo und nutze es in HiddenFoo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301874</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 25 Feb 2013 12:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 12:56:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Typed getBar() const;
</code></pre>
<p>Warum dann ueberhaupt Pimpl, wenn du Interna nach aussen reichst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301877</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 Feb 2013 12:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:02:25 GMT]]></title><description><![CDATA[<p>Hauptsächlich weil ich meine Compilezeit runterdrehen will und das äussere Interface klein bleiben soll.</p>
<p>Seit wann sagt das PIMPL-Idiom, dass nichts nach aussen gegeben werden darf?<br />
Es soll doch das Interface einschränken sowie die Abhängigkeiten und die Kompilierzeit verringern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301880</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:05:06 GMT]]></title><description><![CDATA[<p>Na ja, pimpl benutze ich eigentlich nur wenn ich große/nervige Header vor dem Rest des Projekts verstecken will (windows.h). Scheint mir reichlich sinnlos sonst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301881</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:05:06 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:12:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Kompilierzeit verringern</p>
</blockquote>
<p>Das ist heute kein Problem.</p>
<p>Pimpl benutze ich aehnlich wie cooky, um Plattformabhaengigkeiten zu kapseln, wie beispielsweise CommPorts mit vielen HANDLEs etc . Interna nach aussen geben, bedeutet ja gerade Abhaengigkeiten auf Implementationsdetails zuzulassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301883</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:18:59 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code>// Foo.h
class HiddenFoo;

class Foo
{
	std::unique_ptr&lt;HiddenFoo&gt; m_foo;
	
public:
	Foo();
	
	Typed getBar() const; // dieses Typed
};
</code></pre>
<pre><code>// Foo.cpp
#include &quot;HiddenFoo.h&quot;

Foo::Foo()
		: m_foo(new HiddenFoo)
	{}

Typed Foo::getBar() const // dieses Typed
	{
		return this-&gt;m_foo-&gt;getBar();
	}
</code></pre>
</blockquote>
<p>So schonmal gar nicht. Das Klassen-Template unique_ptr&lt;T&gt; erlauibt zwar unvollständige Typen T im Allgemeinen, aber der Default-Deleter will dort, wo er instantiiert wird, einen vollständigen Typen haben. Und der wird bei reset, operator= und dem Destruktor von unique_ptr&lt;T&gt; ja benötigt. Deklarierst du also den Destruktor nicht im Header, wird er ggf on-the-fly inline an einer Stelle generiert, wo T noch unvollständig ist. Der Destruktor will dann auch operator() des Default-Deleters instantiiert haben und dann knallts. Ich würde von einer guten Implementierung erwarten, dass so ein Fehler erkannt werden kann ... und dann die Compilierung mit einer Fehlermeldung endet.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>[...] aber ich habe in der weggekapselten Klasse eine komplexeres Typedef [...] Und dieses brauche ich in der PIMPL-Klasse. Aber wie mache ich das dort sichtbar ohne das PIMPL zu entfernen?</p>
</blockquote>
<p>Du packst diesen typedef irgendwie in den Header rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301886</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:20:42 GMT]]></title><description><![CDATA[<p>Das der Destruktor in die CPP muss sowie die Regel der Großen Drei eingehalten werden muss, weiss ich, das habe ich auch gemacht. Das soll jetzt auch nicht Thema sein hier, denn es vergrößert das Beispiel nur immens und bringt keinen semantischen Mehrwert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301888</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 13:20:50 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Kompilierzeit verringern</p>
</blockquote>
<p>Das ist heute kein Problem.</p>
</blockquote>
<p>oh doch, wenn die Projekte groß genug werden...</p>
<p>ein kompletter Clean Build unserer Solution dauert fast eine halbe Stunde... das übernimmt zum Glück der nächtliche Buildserver. Aber bei Änderungen an zentralen Komponenten kann es schonmal 5-10 Minuten dauern, bis das Ding startet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301889</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 25 Feb 2013 13:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 14:05:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe nicht gesagt, dass es nicht dauert. Ich habe nur gesagt, dass das Problem nicht besteht, weil es anders geloest wird. Auch wird wohl kaum jemand nach dem Trial &amp; Error Prinzip zentrale Komponenten aendern.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2301896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301896</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 25 Feb 2013 14:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:06:58 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Hauptsächlich weil ich meine Compilezeit runterdrehen will und das äussere Interface klein bleiben soll.</p>
</blockquote>
<p>Hab ich mir gleich gedacht, nachdem ich Deine Deutsch verstanden hatte. Wir kommen der Sache näher.<br />
Wenn es um komplexte Typem wie angegeben handelt, dann geht das nicht, vermute ich. Wenn es nur darum geht, die &lt;windows.h&gt; loszuwerden, dann geht das sogar ohgne pimpl viel besser.<br />
Wobei Rückgabetypen auch bloß geforwarded sein können. Verträgt sich aber weniger mit Templates.<br />
Ich benutze fast nie pimpl, insbesondere nicht, um compilezeit zu sparen.</p>
<p>Ach, ich verwende es nicht, um was zu verstecken, sondern (extrem selten) um Laufzeitpolymorphie zu haben, ohne Zeiger oder Referenzen zu sehen. Das Verstecken-Können ist dann nur zufällig ein netter Bonus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301901</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:00:06 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich benutze fast <strong>nue</strong> pimpl, insbesondere nicht, um compilezeit zu sparen.</p>
</blockquote>
<p>Nie oder nur?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301903</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:04:02 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich benutze fast <strong>nue</strong> pimpl, insbesondere nicht, um compilezeit zu sparen.</p>
</blockquote>
<p>Nie oder nur?</p>
</blockquote>
<p>nie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301905</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:04:02 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:06:58 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wenn es nur darum geht, die &lt;windows.h&gt; loszuwerden, dann geht das sogar ohgne pimpl viel besser.</p>
</blockquote>
<p>Wie? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2301907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301907</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:38:33 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Wenn es nur darum geht, die &lt;windows.h&gt; loszuwerden, dann geht das sogar ohgne pimpl viel besser.</p>
</blockquote>
<p>Wie? <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>
</blockquote>
<p>&lt;winforward.h&gt;</p>
<pre><code>typedef void* HANDLE;
...
</code></pre>
<p>&lt;winforward.cpp&gt;</p>
<pre><code>#include &lt;windows.h&gt;
#include &lt;winforward.h&gt;

static_assert&lt;same_type&lt;void*,HANDLE&gt;&gt;;
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2301917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301917</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 15:45:37 GMT]]></title><description><![CDATA[<p>Ja.. und wie rufst du jetzt CreateWindow etc. auf? Ist ja dann auch so eine Art pimpl, nur halt ohne new. Und wenn man noch mehr will, dann muss man das auch alles im Header typedeffen. Und dann ist es auch nicht als plattformunabhängige Kapselung geeignet, weil die typedefs entsprechend angepasst werden müssten. Ne, da bleibe ich lieber bei pimpl. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301920</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 25 Feb 2013 15:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to PIMPL und Typedef in der versteckten Klasse on Mon, 25 Feb 2013 16:24:59 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Ja.. und wie rufst du jetzt CreateWindow etc. auf?´</p>
</blockquote>
<p>Wer so fette Brocken aufruft, darf im Allgemeinen sogar die &lt;windows.h&gt; höchstselbst inkludieren.<br />
Mir geht es darum, daß die tausend Helfer-Klassen File, Event, Semaphore, FileMapping, sowie einige Helfer-Funktionen wie sleep oder set dadurch plattformunabhängig werden. daß ich</p>
<pre><code>typedef void* os::FileHandle;
</code></pre>
<p>mache, bzw unter linux int statt void*, und ich FileHandle benutze. Dadurch brauche ich kein pimpl, was da wirklich übertrieben langsam wäre.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Ist ja dann auch so eine Art pimpl, nur halt ohne new. Und wenn man noch mehr will, dann muss man das auch alles im Header typedeffen. Und dann ist es auch nicht als plattformunabhängige Kapselung geeignet, weil die typedefs entsprechend angepasst werden müssten. Ne, da bleibe ich lieber bei pimpl. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Es ist absolut geeignet für Plattformabhängigkeit wegmachen und gleichzeitig Compilezeit zu sparen, wenn man nicht auf HANDLE und so geht, sondern auf FileHandle, Socket, Event, auf die Begriffe, die die Betriebssysteme gemeinsam haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301935</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Feb 2013 16:24:59 GMT</pubDate></item></channel></rss>