<?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[Wie Zugriff limitieren?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine abstrakte Factory Klasse und verschiedene konkrete Subklassen, sagen wir mal FooFactory. Die Factory kann verschiedene Objekte vom Typ A, B, C erzeugen.<br />
Wenn ein Objekt erzeugt wird, soll es sich bei der Factory registrieren, z.B.:</p>
<pre><code class="language-cpp">A::A() {
...
   mFactory-&gt;register(this);
}
</code></pre>
<p>Das Problem: Factory::register() sollte nur von A,B,C Klassen aufgerufen werden können, sprich: private sein. Nur kann ich nicht in class Factory einfach friend class A machen, da die konkreten Methoden in Factory pure virtual sind und erst in den konkreten Factorys implementiert werden.<br />
Also müsste ich in jede konkrete Factory, wie z.b. FooFactory ein friend class A; friend class B; etc setzen.</p>
<p>Geht das irgendwie schöner?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299457/wie-zugriff-limitieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 06:12:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299457.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Feb 2012 15:12:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 15:12:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine abstrakte Factory Klasse und verschiedene konkrete Subklassen, sagen wir mal FooFactory. Die Factory kann verschiedene Objekte vom Typ A, B, C erzeugen.<br />
Wenn ein Objekt erzeugt wird, soll es sich bei der Factory registrieren, z.B.:</p>
<pre><code class="language-cpp">A::A() {
...
   mFactory-&gt;register(this);
}
</code></pre>
<p>Das Problem: Factory::register() sollte nur von A,B,C Klassen aufgerufen werden können, sprich: private sein. Nur kann ich nicht in class Factory einfach friend class A machen, da die konkreten Methoden in Factory pure virtual sind und erst in den konkreten Factorys implementiert werden.<br />
Also müsste ich in jede konkrete Factory, wie z.b. FooFactory ein friend class A; friend class B; etc setzen.</p>
<p>Geht das irgendwie schöner?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179817</guid><dc:creator><![CDATA[bettor]]></dc:creator><pubDate>Sat, 11 Feb 2012 15:12:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 15:50:20 GMT]]></title><description><![CDATA[<p>Mach register nicht direkt virtuell, sondern eine Funktion, die die virtuelle aufruft. Dann kannst du auch das mit dem friend dort implementieren.<br />
Das ist sogar ein übliches Pattern, habe allerdings vergessen wie es heisst. ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179837</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 11 Feb 2012 15:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 15:56:54 GMT]]></title><description><![CDATA[<p>Non-virtual interface, kurz NVI.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179840</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 11 Feb 2012 15:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 15:58:29 GMT]]></title><description><![CDATA[<p>Ah, genau das wars. ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179843</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 11 Feb 2012 15:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 17:22:09 GMT]]></title><description><![CDATA[<p>Das sieht klasse aus, danke!</p>
<p>Dann habe ich gleich noch eine ähnliche Frage:</p>
<p>Sagen wir die abstrakte Factory hat createXY Methoden:</p>
<pre><code class="language-cpp">virtual A* Factory::createA(string) = 0;
virtual B* Factory::createB(string) = 0;
</code></pre>
<p>A und B sind ebenfalls abstrakte Klassen. Konkrete Factories geben dann konkrete Objekte zurück:</p>
<pre><code class="language-cpp">virtual AFoo* FooFactory::createA(string);
virtual BFoo* FooFactory::createB(string);
</code></pre>
<p>Ich will nun, dass NUR Factories A und B Objekte (sprich AFoo, BFoo etc.) erzeugen kann. Wie kann man das sicherstellen?<br />
Ich kann ja nicht einfach Factory zu einem friend von A machen, denn wird ja<br />
ein AFoo von FooFactory erzeugt. Sprich ich müsste JEDER konkreten Objektklasse (AFoo, BFoo...) ihre jeweilige konkrete Factory (FooFactory etc.) als friend geben.<br />
Klingt schlecht. WIe könnte man das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179877</guid><dc:creator><![CDATA[bettor]]></dc:creator><pubDate>Sat, 11 Feb 2012 17:22:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 17:28:33 GMT]]></title><description><![CDATA[<p>Du kannst beim Registrieren der Factory einen &quot;Creator&quot; übergeben. Dieser ist z.B. eine private statische Method die den privaten Ctor aufruft und die einzige Möglickeit das jeweilge Objekt zu erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179884</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 11 Feb 2012 17:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 17:34:29 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Mach register nicht direkt virtuell, sondern eine Funktion, die die virtuelle aufruft. Dann kannst du auch das mit dem friend dort implementieren.<br />
Das ist sogar ein übliches Pattern, habe allerdings vergessen wie es heisst. ^^</p>
</blockquote>
<p>Mir is grad aufgefallen, dass das nicht funktioniert.<br />
Ich habe es jetzt so (Frage im Code):</p>
<pre><code class="language-cpp">class Factory {
private:
   friend class A; // A soll registerA() aufrufen dürfen

   void registerA(A* a) {
      registerAImpl(a);
   }

   virtual void registerAImpl(A* a) = 0;

};

class FooFactory : public Factory {
private:
   virtual void registerAImpl(A* a) { ... }

};

class A {
   Factory* mCreator; 
public:

  virtual void method() = 0; // A ist abstrakt
};

class AFoo : public A {
public:
   void init() {
       mCreator-&gt;registerA(this); // Das hier geht nicht! Den nur A ist friend der Factory. Ich müsste in Factory die konkreten Subklassen 
//(AFoo, BFoo etc) als friend deklarieren. Geht das anders?
   }

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2179888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179888</guid><dc:creator><![CDATA[bettor]]></dc:creator><pubDate>Sat, 11 Feb 2012 17:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 17:57:58 GMT]]></title><description><![CDATA[<p>Dann lass das registrieren halt A machen, anstatt AFoo.</p>
<p>Du solltest auch eher Konstruktoren verwenden und auch Überladung wäre etwas, womit du deinen Code schöner machen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179897</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 11 Feb 2012 17:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Zugriff limitieren? on Sat, 11 Feb 2012 20:38:46 GMT]]></title><description><![CDATA[<p><a href="http://www.codedomain.de/peanuts/codedom.nsf/images/JREK-8R5R6W/$File/ProblemFactory.jpeg" rel="nofollow">http://www.codedomain.de/peanuts/codedom.nsf/images/JREK-8R5R6W/$File/ProblemFactory.jpeg</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2179940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2179940</guid><dc:creator><![CDATA[problemfac]]></dc:creator><pubDate>Sat, 11 Feb 2012 20:38:46 GMT</pubDate></item></channel></rss>