<?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[Designfrage pImpl]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>gleich zur Sache:</p>
<pre><code class="language-cpp">// A.hpp

class A{
    class impl;
    impl* pImpl;
public:
    A();
};

// A.cpp

class A::impl{
     C *ptr;                 // C ist irgendein implementierungsabhängiges Konstrukt
     impl(C* p) : ptr(p){}
};

A::A() : pImpl(new impl){}
</code></pre>
<p>Meine Frage hierzu:<br />
Wie bring ich dem Interface A &quot;schonend&quot; bei, dass A::impl bezüglich der Konstruktion einen Pointer auf C verlangt? Entsprechend der Implementierung A einen anderer Konstruktor zu spendieren find ich persönlich nicht sehr schön. Ich denke, dass wird auch generell so gesehen?! <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="😉"
    /></p>
<p>Andererseits dachte ich mir, ich könnte natürlich noch einen weiteren Typen einführen, der einfach nur das C* kapselt:</p>
<pre><code class="language-cpp">class Capsule{
   C* ptr;
   Capsule(C* p) : ptr(p){}  

   C* get_impl(){
     return ptr;
   }
};
</code></pre>
<p>und A per Konstruktor eine Instanz von Capsule übergeben, die dann entsprechend an den Konstruktor von A::impl weitergeben wird, wo letztlich die get_impl-Methode aufgerufen wird, um an den Pointer zu kommen. Ist diese Variante so in Ordnung bzw. wie löst ihr solche Konstrukte auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281435/designfrage-pimpl</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 15:46:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281435.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Feb 2011 18:32:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage pImpl on Tue, 01 Feb 2011 18:32:40 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>gleich zur Sache:</p>
<pre><code class="language-cpp">// A.hpp

class A{
    class impl;
    impl* pImpl;
public:
    A();
};

// A.cpp

class A::impl{
     C *ptr;                 // C ist irgendein implementierungsabhängiges Konstrukt
     impl(C* p) : ptr(p){}
};

A::A() : pImpl(new impl){}
</code></pre>
<p>Meine Frage hierzu:<br />
Wie bring ich dem Interface A &quot;schonend&quot; bei, dass A::impl bezüglich der Konstruktion einen Pointer auf C verlangt? Entsprechend der Implementierung A einen anderer Konstruktor zu spendieren find ich persönlich nicht sehr schön. Ich denke, dass wird auch generell so gesehen?! <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="😉"
    /></p>
<p>Andererseits dachte ich mir, ich könnte natürlich noch einen weiteren Typen einführen, der einfach nur das C* kapselt:</p>
<pre><code class="language-cpp">class Capsule{
   C* ptr;
   Capsule(C* p) : ptr(p){}  

   C* get_impl(){
     return ptr;
   }
};
</code></pre>
<p>und A per Konstruktor eine Instanz von Capsule übergeben, die dann entsprechend an den Konstruktor von A::impl weitergeben wird, wo letztlich die get_impl-Methode aufgerufen wird, um an den Pointer zu kommen. Ist diese Variante so in Ordnung bzw. wie löst ihr solche Konstrukte auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015318</guid><dc:creator><![CDATA[pImpler]]></dc:creator><pubDate>Tue, 01 Feb 2011 18:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage pImpl on Tue, 01 Feb 2011 20:29:55 GMT]]></title><description><![CDATA[<p>Also entweder Klasse A braucht dieses Konstrukt insgesamt (also öffentlich), oder der Konstruktor von A muss das A::impl auch nicht übergeben. Wo soll dieses C denn herkommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015374</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 01 Feb 2011 20:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage pImpl on Tue, 01 Feb 2011 21:54:20 GMT]]></title><description><![CDATA[<p>Decimad  schrieb:</p>
<blockquote>
<p>Also entweder Klasse A braucht dieses Konstrukt insgesamt (also öffentlich), oder der Konstruktor von A muss das A::impl auch nicht übergeben. Wo soll dieses C denn herkommen?</p>
</blockquote>
<p>Ok, ist nicht ganz deutlich geworden. Stell dir also vor, dieser Pointer auf C stammt aus irgendeiner implementierungsspezifischen Factory-Funktion:</p>
<pre><code class="language-cpp">C* factoryC();

C* ptr = factoryC(); 
A a(ptr);            // Sollte A wirklich implementierungsspezifische Werte erwarten?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2015408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015408</guid><dc:creator><![CDATA[pimpler]]></dc:creator><pubDate>Tue, 01 Feb 2011 21:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage pImpl on Tue, 01 Feb 2011 23:42:10 GMT]]></title><description><![CDATA[<p>Naja.</p>
<p>Wenn alle (bzw. zumindest einige) mögliche Implementierungen von A etwas brauchen, damit man ein A erstellen kann, dann ist zumindest dieser Umstand schonmal nicht implementierungsspezifisch.</p>
<p>Wenn der genaue Typ implementierungsspezifisch ist, dann reich doch einfach einen Basisklassenzeiger rum.</p>
<pre><code class="language-cpp">CBase* AParameterFactory();

class A
{
public:
    A(CBase* parameter);
};
</code></pre>
<p>Die konkrete Klasse C (die von CBase abgeleitet ist) muss für den User-Programmierer nichtmal sichtbar sein (z.B. weil sie in einem privaten Headerfile definiert wird, oder gleich in einem anonymen Namespace).</p>
<p>Das ist eine Möglichkeit.</p>
<p>Eine andere Möglichkeit wäre gleich die Factory bzw. ein Factory-Object an A zu übergeben, so dass A sich das benötigte Objekt selbst erstellt.</p>
<p>----</p>
<p>Wenn das auf dein spezielles Problem schlecht passt, beschreib dein Problem etwas konkreter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015445</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Feb 2011 23:42:10 GMT</pubDate></item></channel></rss>