<?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[Frage zu factory-function]]></title><description><![CDATA[<p>Hey !</p>
<p>In einem meiner Übungsbücher gabe es eine Aufgabe in der man Factory-Funktionen erstellen sollte , mit einer abstrakten Überkalsse.<br />
ich habe das ganze so gelöst :</p>
<pre><code class="language-cpp">class Shape {
    public:
       virtual void Draw() = 0;

       static Shape* Create(string type);
};

class Circle : public Shape {...};

class Square : public Shape {...};

Shape* Shape::Create(string type) {
    if ( type =...
}

int main()
{

   Shape* obj1 = Shape::Create(&quot;circle&quot;);

   obj1-&gt;Draw();

}
</code></pre>
<p>In der Lösung ist aber noch etwas anderes dabei: in den Klassen Circle und Square steht am ende noch</p>
<pre><code class="language-cpp">friend class Shape;
</code></pre>
<p>Warum ?Und welchen Vorteil bringt das ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296697/frage-zu-factory-function</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 17:59:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296697.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Dec 2011 12:08:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:08:01 GMT]]></title><description><![CDATA[<p>Hey !</p>
<p>In einem meiner Übungsbücher gabe es eine Aufgabe in der man Factory-Funktionen erstellen sollte , mit einer abstrakten Überkalsse.<br />
ich habe das ganze so gelöst :</p>
<pre><code class="language-cpp">class Shape {
    public:
       virtual void Draw() = 0;

       static Shape* Create(string type);
};

class Circle : public Shape {...};

class Square : public Shape {...};

Shape* Shape::Create(string type) {
    if ( type =...
}

int main()
{

   Shape* obj1 = Shape::Create(&quot;circle&quot;);

   obj1-&gt;Draw();

}
</code></pre>
<p>In der Lösung ist aber noch etwas anderes dabei: in den Klassen Circle und Square steht am ende noch</p>
<pre><code class="language-cpp">friend class Shape;
</code></pre>
<p>Warum ?Und welchen Vorteil bringt das ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155331</guid><dc:creator><![CDATA[7xCore]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:21:04 GMT]]></title><description><![CDATA[<p>Das war wohl eher so gemeint:</p>
<pre><code class="language-cpp">struct shape
{
    virtual void draw() const = 0;
    virtual ~shape() {}
};

struct circle : shape
{
    virtual void draw() const { std::cout &lt;&lt; &quot;circle::draw\n&quot;; }
};

struct square : shape
{
    virtual void draw() const { std::cout &lt;&lt; &quot;square::draw\n&quot;; }
};

struct shape_factory
{
    void add_creator(std::string const&amp; what, std::function&lt;shape*()&gt; func) { creators.insert(std::make_pair(what, func));

    shape* create(std::string const&amp; what) const
    {
        auto iter = creators.find(what);

        if(iter == creators.end())
            return 0;

        return iter-&gt;second();
    }

private:
    std::map&lt;std::string, std::function&lt;shape*()&gt;&gt; creators;
};

shape* create_circle() { return new circle; }
shape* create_square() { return new square; }

int main()
{
    shape_factory f;
    f.add_creator(&quot;circle&quot;, create_circle);
    f.add_creator(&quot;square&quot;, create_square);

    shape* s1 = f.create(&quot;circle&quot;);
    shape* s2 = f.create(&quot;square&quot;);

    s1-&gt;draw();
    s2-&gt;draw();
}
</code></pre>
<p>Ungetestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155334</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:21:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:28:25 GMT]]></title><description><![CDATA[<p>Danke für deine Vorschlag PI, doch beantwortet das mit leider nicht was es mit diesem friend auf sich hat. :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155336</guid><dc:creator><![CDATA[7xCore]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:28:42 GMT]]></title><description><![CDATA[<p>Ob das so gemeint war weiß ich nun nicht. Ich vermute mal nicht. Du müsstest schon die genaue Aufgabe formulieren. Factory Muster gibts es viele. Die bekanntesten sind die GoF Muster, Abstrakte Fabrik und Fabrikmethode. Die von pi gezeigte Factory ist auch eine gebräuchliche Implementierung. Was man wählr hängt halt von der konkreten Situation/aufgabe ab.</p>
<p>7xCore schrieb:</p>
<blockquote>
<p>In der Lösung ist aber noch etwas anderes dabei: in den Klassen Circle und Square steht am ende noch</p>
<pre><code class="language-cpp">friend class Shape;
</code></pre>
<p>Warum? Und welchen Vorteil bringt das?</p>
</blockquote>
<p>Ich vermute mal eher gar keinen. Es bedeutet,dass Shape Zugriff auf Interna von Square und Circle hat (Vielleicht um in Create einen privaten Ctor aufzurufen oder so ein Blödsinn). Wenig sinnvoll ist es, da eine Basisklasse keine Abhängigkeit zu ihren Kindklassen haben sollte. Das ist ziemlicher Unfug. Was hast Du denn da für ein Buch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155337</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:30:00 GMT]]></title><description><![CDATA[<p>Das weiß ich nicht. Poste doch mal die Lösung. <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 />
Klingt aber auf jeden Fall schwachsinnig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155338</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:33:30 GMT]]></title><description><![CDATA[<p>Also dieses friend macht nur klar das die basis klasse zugriff auf die unterklassen hat ? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155341</guid><dc:creator><![CDATA[7xCore]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:38:50 GMT]]></title><description><![CDATA[<p>7xCore schrieb:</p>
<blockquote>
<p>Also dieses friend macht nur klar das die basis klasse zugriff auf die unterklassen hat ? <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="😕"
    /></p>
</blockquote>
<p>Eine friend Klasse hat Zugriff auf protected und private Elemente der Klasse. Das ist generell selten sinnvoll und besonders schwachsinnig, wenn die Basisklasse auf ihre Spezialisierungen zugreift.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155345</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:39:17 GMT]]></title><description><![CDATA[<p>Ja, wobei es meiner Meinung nach mehr Sinn machen würde, in der Basisklasse protected Member oder Methoden bereit zu stellen, die dann benutzt werden. Das die Basisklasse in Unterklassen zum friend wird, habe ich noch nicht gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155346</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 12:42:38 GMT]]></title><description><![CDATA[<p>Ok das hat meine Frage eigentlich beantwortet.Danke für eure Hilfe.<br />
Eine kleine Frage dann noch: wann würde man dann friend benutzen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155348</guid><dc:creator><![CDATA[7xCore]]></dc:creator><pubDate>Sat, 10 Dec 2011 12:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 13:26:47 GMT]]></title><description><![CDATA[<p>Zum Beispiel um den &lt;&lt; Operator in der Klasse zu überladen, um solche Sachen zu ermöglichen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class foobar
{
    public:
         int test;
         foobar(int number) : test(number) { }
         friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const foobar&amp; fb)
         {
             out &lt;&lt; fb.test;
             return out;
         }
};

int main()
{
    foobar fb(5);
    std::cout &lt;&lt; fb;
}
</code></pre>
<p>Ist jetzt nur ein kleines minimal Beispiel davon. friend bei Klassen zu benutzen, ist meiner Meinung nach schlechter Stil, weil die Kapselung und sonstiges flöten geht. Ich habe es aufjedenfall bisher noch nicht gebraucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155362</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sat, 10 Dec 2011 13:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 22:04:08 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Eine friend Klasse hat Zugriff auf protected und private Elemente der Klasse. Das ist generell selten sinnvoll</p>
</blockquote>
<p>Ach?</p>
<blockquote>
<p>und besonders schwachsinnig, wenn die Basisklasse auf ihre Spezialisierungen zugreift.</p>
</blockquote>
<p>Wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155533</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Dec 2011 22:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sat, 10 Dec 2011 22:09:13 GMT]]></title><description><![CDATA[<p>Wenn die Konstruktoren in Circle und Square privat sind, könnte man mit dem friend auch bezwecken, dass nur Shape die beiden erzeugen kann und zwar so wie das eben die Factory Funktion in Shape vorschreibt (z.B. nur mit new, mit anschliessendem Initialize(..) etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155535</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 10 Dec 2011 22:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sun, 11 Dec 2011 10:13:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Eine friend Klasse hat Zugriff auf protected und private Elemente der Klasse. Das ist generell selten sinnvoll</p>
</blockquote>
<p>Ach?</p>
<blockquote>
<p>und besonders schwachsinnig, wenn die Basisklasse auf ihre Spezialisierungen zugreift.</p>
</blockquote>
<p>Wirklich?</p>
</blockquote>
<p>Soll ich mich jetzt selber korrigieren? Wie wär es mit einer sinnvollen Aussage. Ich habe kein Problem damit, wenn mich jemand eines Besseren belehrt, also einfach raus damit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155623</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 11 Dec 2011 10:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sun, 11 Dec 2011 10:45:28 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Eine friend Klasse hat Zugriff auf protected und private Elemente der Klasse. Das ist generell selten sinnvoll</p>
</blockquote>
<p>Ach?</p>
<blockquote>
<p>und besonders schwachsinnig, wenn die Basisklasse auf ihre Spezialisierungen zugreift.</p>
</blockquote>
<p>Wirklich?</p>
</blockquote>
<p>Solche Kommentare sind wircklich unnötig.Tut mir leid wenn ich nicht so schlau wie du bin, aber es hat mir echt geholfen, wie es brotbernd erklärt hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155637</guid><dc:creator><![CDATA[7xCore]]></dc:creator><pubDate>Sun, 11 Dec 2011 10:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Sun, 11 Dec 2011 21:28:41 GMT]]></title><description><![CDATA[<p>Naja, Hinweise darauf dass etwas selten sinnvoll bzw. &quot;besonders schwachsinnig&quot; ist, ohne Begründung, sind für mich auch nicht wirklich hilfreich.</p>
<p>z.T. <code>friend</code> , und wozu es gut ist, steht hier einiges:<br />
<a href="http://www.parashift.com/c++-faq-lite/friends.html" rel="nofollow">http://www.parashift.com/c++-faq-lite/friends.html</a></p>
<p>Beispiele wo man oft sinnvoll <code>friend</code> verwenden kann wären z.B. Operatoren (siehe FreakY&lt;3Cpp's Beispiel).</p>
<p>Was das spezielle Thema &quot;Basisklasse greift auf Spezialisierungen zu&quot; angeht: ich hab' in einem meiner Projekte in der Arbeit z.B. genau so einen Fall.</p>
<p>Es gibt eine Basisklasse <code>GUI::Control</code> . Aus bestimmten Gründen müssen diese GUI Controls nach einem bestimmten Schema 2-Phase konstruiert werden. Also gibt es ein Funktionstemplate <code>GUI::Control::CreateControl&lt;T&gt;</code> , wo der nötige Code drinnen steht.<br />
Um Unfälle zu vermeiden machen die abgeleiteten Control-Klassen ihren Ctor private (bzw. protected, wenn sie selbst sinnvoll als Basisklasse verwendet werden können), und erklären <code>GUI::Control</code> zum <code>friend</code> .</p>
<p>Ich finde das nicht besonders schwachsinnig, sondern eigentlich ganz gut so.</p>
<p>Was <em>in vielen Fällen</em> wirklich schwachsinnig wäre, ist, wenn die Basisklasse die abgeleiteten Klassen &quot;kennt&quot;. Wobei ich mir fast sicher bin, dass es auch da ein paar Fälle gibt, wo es sinnvoll sein kann so ein Konstrukt zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155916</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 11 Dec 2011 21:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Mon, 12 Dec 2011 07:57:09 GMT]]></title><description><![CDATA[<p>Warum erzeugt denn die Basisklasse Instanzen? Wieso macht das nicht etwas wie <code>GUI::ControlFactory::CreateControl&lt;T&gt;</code> , das dann friend ist.<br />
Die Schwachsinnigkeit bezog sich natürlich auf Fälle, bei denen die Basisklasse die Spezialisierungen 'kennt'. Andere Konstrukte sind mir gar nicht in den Sinn gekommen. Kommen sie mir ehrlich gesagt auch immer noch nicht. Aber vielleicht gibt es sie ja und ich änder meine Aussage von schwachsinnig zu 'eher ungewöhnlich und i.d.R. nicht empfehlenswert'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156032</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 12 Dec 2011 07:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu factory-function on Mon, 12 Dec 2011 08:43:23 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Warum erzeugt denn die Basisklasse Instanzen? Wieso macht das nicht etwas wie <code>GUI::ControlFactory::CreateControl&lt;T&gt;</code> , das dann friend ist.</p>
</blockquote>
<p>Weil ich es für fragwürdig halten würde, eine &quot;Control Factory&quot; einzuführen.<br />
Die Control Klasse weiss immer noch am besten wie &quot;ihre&quot; Instanzen zu erzeugen sind. Und der einzige Grund, eine &quot;Control Factory&quot; zu haben, wäre die &quot;CreateControl&quot; Funktion zu hosten.</p>
<p>Ja, man könnte es auch so machen. Ich hab' mir das auch schon überlegt. Aber es macht für mich einfach keinen Sinn, daher lasse ich es so wie es ist.</p>
<blockquote>
<p>Aber vielleicht gibt es sie ja und ich änder meine Aussage von schwachsinnig zu 'eher ungewöhnlich und i.d.R. nicht empfehlenswert'.</p>
</blockquote>
<p>Muss schön sein sich so sicher zu sein.<br />
Tu was du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2156046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2156046</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 12 Dec 2011 08:43:23 GMT</pubDate></item></channel></rss>