<?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[Problem mit zyklischer Abhaengigkeit beim Klassendesign.]]></title><description><![CDATA[<p>Hallo liebe C++ Experten.</p>
<p>Ich habe ein Problem beim Design meiner Klassen und hoffe, dass mir vielleicht jemand auf die Spruenge helfen kann.</p>
<p>Es existiert eine Basisklasse 'Device' von der die Klasse 'Controller' erbt. Jedes Device hat protected member, wie die Hardware-Adresse und vor allem einen Pointer auf einen Controller, der fuer dieses Device zustaendig ist. Nun habe ich das Problem der zyklischen Abhaengigkeit, da ja 'Controller.h' in der Klasse Device eingebunden sein muss, um als Member den Typ Controller zur Verfuegung zu haben. Controller erbt allerdings von Device, was zu dem Zeitpunkt des erstmaligen Inkludierens ja noch garnicht bekannt ist. Gibt es eine Loesung fuer das Problem?</p>
<p>Hier nochmal der Quelltext:</p>
<p>Device.h:</p>
<pre><code class="language-cpp">#ifndef __DEVICE__
#define __DEVICE__
using namespace std;

#include &quot;CAENVMEtypes.h&quot;  /// Definitions of types defined by hardware library.
#include &quot;Controller.h&quot;

class Device
{
protected:
unsigned int      mBaseaddress;     ///&lt; base address of Device
CVAddressModifier mAddressModifier; ///&lt; default address modifier
CVDataWidth       mDataWidth;       ///&lt; default data width
VMEController*    mController;      ///&lt; pointer to controller

public:

Device(unsigned int baseaddress = 0x0);
Device(Controller* controller, unsigned int baseaddress = 0x0);
~Device();

/**
* Reads data from device internal address with default data width.
* @param address address offset to read from
*/
virtual long read_addr(unsigned int address);

/**
* Writes data to device internal address with default data width.
* @param address address offset to read from
*/
virtual long write_addr(unsigned int address, long data);
};

#endif
</code></pre>
<p>Controller.h:</p>
<pre><code class="language-cpp">#ifndef __CONTROLLER__
#define __CONTROLLER__

#ifndef __CAENVMELIB__
#define __CAENVMELIB__
#include &quot;CAENVMElib.h&quot; // hardware library used by Controller
#endif

#include &quot;Device.h&quot;

using namespace std;

class Controller: public Device {
private:
int mControllerHandle; ///Handle to access the Controller needed by library.

public:

Controller(short baseaddress = 0);
~Controller();

long read_addr(unsigned int baseaddress, unsigned int address, 
               CVAddressModifier addressmodifier, CVDataWidth datawidth);

long write_addr(unsigned int baseaddress, unsigned int address, 
                CVAddressModifier addressmodifier, CVDataWidth datawidth,
                long data);
</code></pre>
<p>Die Methode read_addr(unsigned int address) des Device sieht dann so aus:</p>
<pre><code class="language-cpp">long read_addr(unsigned int address) {
  mController-&gt;read_addr(mBaseaddress, address, mAddressModifier, mDataWidth);
  return 0;
}
</code></pre>
<p>Das jeweilige Device ruft also seinen zugeordneten Controller auf und teilt der hardwarenahen Controller-Read-Methode seine BaseAddress sowie die zu lesende Registeraddresse 'address' und die Defaultwerte fuer AdressModifier und DataWidth mit.<br />
Die Idee dahinter war, dass auch der Controller ein Device ist (der Controller-Pointer mController wird im Konstruktor einfach auf this gesetzt), sodass man auch beim Controller mit der abstrahierten read und write Methode zum Lesen und Schreiben der Register arbeiten kann...<br />
Waere wirklich toll, wenn mir jemand helfen koennte.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286961/problem-mit-zyklischer-abhaengigkeit-beim-klassendesign</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 15:25:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286961.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 May 2011 13:04:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Thu, 19 May 2011 13:04:18 GMT]]></title><description><![CDATA[<p>Hallo liebe C++ Experten.</p>
<p>Ich habe ein Problem beim Design meiner Klassen und hoffe, dass mir vielleicht jemand auf die Spruenge helfen kann.</p>
<p>Es existiert eine Basisklasse 'Device' von der die Klasse 'Controller' erbt. Jedes Device hat protected member, wie die Hardware-Adresse und vor allem einen Pointer auf einen Controller, der fuer dieses Device zustaendig ist. Nun habe ich das Problem der zyklischen Abhaengigkeit, da ja 'Controller.h' in der Klasse Device eingebunden sein muss, um als Member den Typ Controller zur Verfuegung zu haben. Controller erbt allerdings von Device, was zu dem Zeitpunkt des erstmaligen Inkludierens ja noch garnicht bekannt ist. Gibt es eine Loesung fuer das Problem?</p>
<p>Hier nochmal der Quelltext:</p>
<p>Device.h:</p>
<pre><code class="language-cpp">#ifndef __DEVICE__
#define __DEVICE__
using namespace std;

#include &quot;CAENVMEtypes.h&quot;  /// Definitions of types defined by hardware library.
#include &quot;Controller.h&quot;

class Device
{
protected:
unsigned int      mBaseaddress;     ///&lt; base address of Device
CVAddressModifier mAddressModifier; ///&lt; default address modifier
CVDataWidth       mDataWidth;       ///&lt; default data width
VMEController*    mController;      ///&lt; pointer to controller

public:

Device(unsigned int baseaddress = 0x0);
Device(Controller* controller, unsigned int baseaddress = 0x0);
~Device();

/**
* Reads data from device internal address with default data width.
* @param address address offset to read from
*/
virtual long read_addr(unsigned int address);

/**
* Writes data to device internal address with default data width.
* @param address address offset to read from
*/
virtual long write_addr(unsigned int address, long data);
};

#endif
</code></pre>
<p>Controller.h:</p>
<pre><code class="language-cpp">#ifndef __CONTROLLER__
#define __CONTROLLER__

#ifndef __CAENVMELIB__
#define __CAENVMELIB__
#include &quot;CAENVMElib.h&quot; // hardware library used by Controller
#endif

#include &quot;Device.h&quot;

using namespace std;

class Controller: public Device {
private:
int mControllerHandle; ///Handle to access the Controller needed by library.

public:

Controller(short baseaddress = 0);
~Controller();

long read_addr(unsigned int baseaddress, unsigned int address, 
               CVAddressModifier addressmodifier, CVDataWidth datawidth);

long write_addr(unsigned int baseaddress, unsigned int address, 
                CVAddressModifier addressmodifier, CVDataWidth datawidth,
                long data);
</code></pre>
<p>Die Methode read_addr(unsigned int address) des Device sieht dann so aus:</p>
<pre><code class="language-cpp">long read_addr(unsigned int address) {
  mController-&gt;read_addr(mBaseaddress, address, mAddressModifier, mDataWidth);
  return 0;
}
</code></pre>
<p>Das jeweilige Device ruft also seinen zugeordneten Controller auf und teilt der hardwarenahen Controller-Read-Methode seine BaseAddress sowie die zu lesende Registeraddresse 'address' und die Defaultwerte fuer AdressModifier und DataWidth mit.<br />
Die Idee dahinter war, dass auch der Controller ein Device ist (der Controller-Pointer mController wird im Konstruktor einfach auf this gesetzt), sodass man auch beim Controller mit der abstrahierten read und write Methode zum Lesen und Schreiben der Register arbeiten kann...<br />
Waere wirklich toll, wenn mir jemand helfen koennte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065814</guid><dc:creator><![CDATA[bvormwald]]></dc:creator><pubDate>Thu, 19 May 2011 13:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Thu, 19 May 2011 13:20:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab's nur kurz überlesen... aber wahrscheinlich hilft Dir das.</p>
<p>nîmm in Device.h das include von Controler.h raus und mach statt dessen eine Forward deklaration:</p>
<pre><code class="language-cpp">class Controller;
</code></pre>
<p>im dazugehörenden Device.cpp musst Du aber Controler.h includen.</p>
<p>Herzliche Grüsse<br />
Walter</p>
<p>PS. nimm das &quot;using namespace std;&quot; aus den *.h Files raus, das gehört da definitiv nicht hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065819</guid><dc:creator><![CDATA[weicher]]></dc:creator><pubDate>Thu, 19 May 2011 13:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Thu, 19 May 2011 14:04:12 GMT]]></title><description><![CDATA[<p>Vielen, vielen Dank! Das hat schon geholfen! Die forward declaration hatte ich auch schon probiert, allerdings bin ich nicht auf die Idee gekommen #include &quot;Controller.h&quot; rauszunehmen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> .</p>
<p>Nochmals tausend Dank!</p>
<p>&quot;using namespace std&quot; habe ich nun in die source datei gepackt oder spricht da etwas dagegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065863</guid><dc:creator><![CDATA[bvormwald]]></dc:creator><pubDate>Thu, 19 May 2011 14:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Thu, 19 May 2011 14:54:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<blockquote>
<p>&quot;using namespace std&quot; habe ich nun in die source datei gepackt oder spricht da etwas dagegen?</p>
</blockquote>
<p>ich mache es auch so... Puristen werden uns steinigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Herzliche Grüsse<br />
Walter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065900</guid><dc:creator><![CDATA[weicher]]></dc:creator><pubDate>Thu, 19 May 2011 14:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Thu, 19 May 2011 16:18:57 GMT]]></title><description><![CDATA[<p>Und nochmals: Scheibe C-Code in .h- oder .c-Dateien und C++-Code in .hpp-, .hh-, .cpp- oder in .cc-Dateien! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065946</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 19 May 2011 16:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Fri, 20 May 2011 07:51:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe *.hpp und *.hh ausser in diesem Forum und Boost noch nirgends gesehen. Weder CodeProject, CodeGuru noch irgend eine mir bekannte komerzielle Library verwendet eine dieser Extensions für Header Files.</p>
<p>Ich glaube der Entscheid für *.h als Header Extension auch für C++ ist quasi Basisdemokratisch schon längst gefällt <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>Herzliche Grüsse<br />
Walter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066180</guid><dc:creator><![CDATA[weicher]]></dc:creator><pubDate>Fri, 20 May 2011 07:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Fri, 20 May 2011 08:09:17 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Und nochmals: Scheibe C-Code in .h- oder .c-Dateien und C++-Code in .hpp-, .hh-, .cpp- oder in .cc-Dateien! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Die Endung h ist durchaus auch in C++ üblich, nicht aber die Endung &quot;c&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066192</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 20 May 2011 08:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Fri, 20 May 2011 10:51:53 GMT]]></title><description><![CDATA[<p>weicher schrieb:</p>
<blockquote>
<p>ich habe *.hpp und *.hh ausser in diesem Forum und Boost noch nirgends gesehen.</p>
</blockquote>
<p>Echt? Es stimmt zwar, dass viele C++-Bibliotheken .h benutzen, aber meinem Eindruck nach sind das häufig etwas ältere.</p>
<p>Jedenfalls spricht absolut nichts dagegen, für eigene Projekte .hpp zu nehmen, erst recht keine &quot;quasi basisdemokratische Entscheidung&quot;. Ich würde .hpp sogar empfehlen, um deutlicher zu machen, dass es sich um C++-Code handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066268</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 20 May 2011 10:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit zyklischer Abhaengigkeit beim Klassendesign. on Fri, 20 May 2011 11:15:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>weicher schrieb:</p>
<blockquote>
<p>ich habe *.hpp und *.hh ausser in diesem Forum und Boost noch nirgends gesehen.</p>
</blockquote>
<p>Echt? Es stimmt zwar, dass viele C++-Bibliotheken .h benutzen, aber meinem Eindruck nach sind das häufig etwas ältere.</p>
<p>Jedenfalls spricht absolut nichts dagegen, für eigene Projekte .hpp zu nehmen, erst recht keine &quot;quasi basisdemokratische Entscheidung&quot;. Ich würde .hpp sogar empfehlen, um deutlicher zu machen, dass es sich um C++-Code handelt.</p>
</blockquote>
<p>Ich benutze nur noch .cpp und .hpp .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066283</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 May 2011 11:15:25 GMT</pubDate></item></channel></rss>