<?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[Fehler im Konstruktor der Basisklasse]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>also ich habe folgende Klassen erstellt(aufs wesentliche reduziert):</p>
<pre><code class="language-cpp">string CURRENTDIRECTORY_SAVE; 
CEntitySortCount *pEntities;
XXX *pXXX;
class XXX
{
private:
    CBEntity **pEntity;
    const string CURRENTDIRECTORY_XXX;
public:
    XXX(const string &amp;name);
    void CreateEntities();
    string GetCURRENTDIRECTORY_XXX();
};
//-----------------------Definitionen--------------------
XXX::XXX(const string &amp;name)          //(2)
         : (...), CURRENTDIRECTORY_XXX(CURRENTDIRECTORY_SAVE + name) 
{
    pEntity = new CBEntity*[pEntities-&gt;Entities_total + 1];
    (...)
    CreateEntities();       //(3)
}

void XXX::CreateEntities()    //(4)
{
    pEntity[0] = new EntityRoot(pEntities-&gt;pName[0]);   //(5)
    (...)
}

string XXX::GetCURRENTDIRECTORY_XXX(){
	return CURRENTDIRECTORY_XXX;}   //(8)

//=======================================================
class CBEntity
{
protected:
	(...)
	CBClass **pClass;
	(...)
	string CURRENTDIRECTORY_ENTITY;
public:
	CBEntity(const string &amp;name, const string &amp;currentdirectory);
};

//------------------Definitionen-------------------------
CBEntity::CBEntity(const string &amp;name, const string &amp;currentdirectory =&quot;&quot;)
    : (...), CURRENTDIRECTORY_ENTITY(pXXX-&gt;GetCURRENTDIRECTORY_XXX() + currentdirectory)   //(7)
{}

//=======================================================
class EntityRoot: public CBEntity
{
public:
    EntityRoot(const string &amp;name);
};

//--------------------Definitionen-----------------------
EntityRoot::EntityRoot(const std::string &amp;name): CBEntity(name, &quot;/0_RootEntity&quot;)  //(6)
{ (...) }

//=======================================================
class CEntitySortCount
{
public:
    //(...)
    unsigned short Entities_total;
    string *pName;
    CEntitySortCount(unsigned short npc, unsigned short monster,
	  unsigned short item, unsigned short chest): (...)  
	  {
	      Entities_total = //Initialisierung ; 
	      pName = new string[Entities_total + 1]; 
	  }
};

//==================Startfunktion=========================
void CreateXXXPrototype()
{
	//CEntitySortCount *pEntities initialisieren!
	pEntities = new CEntitySortCount(0,0,0,0);
	pEntities-&gt;pName[0] = &quot;RootEntity&quot;;
	//XXX-Prototyp Erstellen!
	pXXX = new XXX(&quot;String&quot;);      //(1)
}
</code></pre>
<p>In der main() wird CreateXXXPrototype aufgerufen. Danach habe ich den &quot;Problemweg&quot; durch die Nummerierung //(1) - //(2) - ... - //(8) gekennzeichnet. In Markierung //(8) (hier: Zeile 29) bekomme ich folgende Fehlermeldung:</p>
<pre><code>Unhandled exception at 0x104a0fb6 (msvcp90d.dll) in haupt.exe: 0xC0000005: Access violation reading location 0x000000b4.
</code></pre>
<p>Irgendwas stimmt mit der Übergabe des Strings an //(7) nicht, aber ich versteh es nicht.</p>
<p>(der mit new angeforderte Speicherplatz wird natürlich später wieder freigegeben)</p>
<p>Schonmal vielen Dank für die Hilfe <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/topic/232892/fehler-im-konstruktor-der-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 04:19:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232892.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Jan 2009 14:36:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 14:38:27 GMT]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>also ich habe folgende Klassen erstellt(aufs wesentliche reduziert):</p>
<pre><code class="language-cpp">string CURRENTDIRECTORY_SAVE; 
CEntitySortCount *pEntities;
XXX *pXXX;
class XXX
{
private:
    CBEntity **pEntity;
    const string CURRENTDIRECTORY_XXX;
public:
    XXX(const string &amp;name);
    void CreateEntities();
    string GetCURRENTDIRECTORY_XXX();
};
//-----------------------Definitionen--------------------
XXX::XXX(const string &amp;name)          //(2)
         : (...), CURRENTDIRECTORY_XXX(CURRENTDIRECTORY_SAVE + name) 
{
    pEntity = new CBEntity*[pEntities-&gt;Entities_total + 1];
    (...)
    CreateEntities();       //(3)
}

void XXX::CreateEntities()    //(4)
{
    pEntity[0] = new EntityRoot(pEntities-&gt;pName[0]);   //(5)
    (...)
}

string XXX::GetCURRENTDIRECTORY_XXX(){
	return CURRENTDIRECTORY_XXX;}   //(8)

//=======================================================
class CBEntity
{
protected:
	(...)
	CBClass **pClass;
	(...)
	string CURRENTDIRECTORY_ENTITY;
public:
	CBEntity(const string &amp;name, const string &amp;currentdirectory);
};

//------------------Definitionen-------------------------
CBEntity::CBEntity(const string &amp;name, const string &amp;currentdirectory =&quot;&quot;)
    : (...), CURRENTDIRECTORY_ENTITY(pXXX-&gt;GetCURRENTDIRECTORY_XXX() + currentdirectory)   //(7)
{}

//=======================================================
class EntityRoot: public CBEntity
{
public:
    EntityRoot(const string &amp;name);
};

//--------------------Definitionen-----------------------
EntityRoot::EntityRoot(const std::string &amp;name): CBEntity(name, &quot;/0_RootEntity&quot;)  //(6)
{ (...) }

//=======================================================
class CEntitySortCount
{
public:
    //(...)
    unsigned short Entities_total;
    string *pName;
    CEntitySortCount(unsigned short npc, unsigned short monster,
	  unsigned short item, unsigned short chest): (...)  
	  {
	      Entities_total = //Initialisierung ; 
	      pName = new string[Entities_total + 1]; 
	  }
};

//==================Startfunktion=========================
void CreateXXXPrototype()
{
	//CEntitySortCount *pEntities initialisieren!
	pEntities = new CEntitySortCount(0,0,0,0);
	pEntities-&gt;pName[0] = &quot;RootEntity&quot;;
	//XXX-Prototyp Erstellen!
	pXXX = new XXX(&quot;String&quot;);      //(1)
}
</code></pre>
<p>In der main() wird CreateXXXPrototype aufgerufen. Danach habe ich den &quot;Problemweg&quot; durch die Nummerierung //(1) - //(2) - ... - //(8) gekennzeichnet. In Markierung //(8) (hier: Zeile 29) bekomme ich folgende Fehlermeldung:</p>
<pre><code>Unhandled exception at 0x104a0fb6 (msvcp90d.dll) in haupt.exe: 0xC0000005: Access violation reading location 0x000000b4.
</code></pre>
<p>Irgendwas stimmt mit der Übergabe des Strings an //(7) nicht, aber ich versteh es nicht.</p>
<p>(der mit new angeforderte Speicherplatz wird natürlich später wieder freigegeben)</p>
<p>Schonmal vielen Dank für die Hilfe <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/1653877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653877</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 28 Jan 2009 14:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 14:54:26 GMT]]></title><description><![CDATA[<p>CreateXXXPrototype -&gt; XXX::XXX -&gt; XXX:CreateEntities -&gt; EntityRoot::EntityRoot -&gt; CBEntity::CBEntity.<br />
Dort wird auf pXXX zugegriffen, der ist aber immer noch null, weil ja das XXX-Objekt noch gar nicht fertig erstellt ist, und die Zuweisung damit auch noch nicht stattgefunden hat.</p>
<p>Furchtbarer Stil, übrigens. Globale Variablen und unsägliches Zeigergehampel. Kein Wunder, dass du nicht mehr durchsteigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653888</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 28 Jan 2009 14:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 15:19:27 GMT]]></title><description><![CDATA[<p>Ist natürlich logisch. Ich frage mich allerdings, wie ich das umgehen kann.<br />
Eine Möglichkeit, die ich sehe wäre den Aufruf von &quot;XXX:CreateEntities&quot; aus dem Konstruktor zu entfernen und CBEntity **pEntity; erstmal auf NULL setzen. Erst wenn das Objekt erstellt ist &quot;XXX:CreateEntities&quot; über pXXX aufrufen.<br />
Das dürfte doch klappen, oder?</p>
<blockquote>
<p>Furchtbarer Stil, übrigens. Globale Variablen und unsägliches Zeigergehampel. Kein Wunder, dass du nicht mehr durchsteigst.</p>
</blockquote>
<p>Das wird wohl stimmen. Allerdings wüsste ich nicht, wie ich das Problem anders lösen sollte. Nebenbei bemerkt bin ich noch relativ am Anfang mit C++.</p>
<p>Wie soll ich denn diese globalen Variablen umgehen? Zumindest<br />
[/cpp]CEntitySortCount *pEntities;<br />
XXX *pXXX;[cpp]</p>
<p>werden sehr oft gebraucht. Ich könnte sie natürlich &quot;thematisch&quot; in einer extra Klasse zusammenfassen, allerdings fände ich das auch nicht gerade übersichtlich.</p>
<p>Das mit dem &quot;Zeigergehampel&quot; kann ich verstehen. Aber das ist alles ziemlich abhängig von den Eingaben des benutzers, desswegen habe ich es so gemacht.<br />
Ich mach das halt nur hobbymäßig <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>
<p>Trotzdem danke für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653911</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 28 Jan 2009 15:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 15:37:36 GMT]]></title><description><![CDATA[<p>Don Quijote schrieb:</p>
<blockquote>
<p>Eine Möglichkeit, die ich sehe wäre den Aufruf von &quot;XXX:CreateEntities&quot; aus dem Konstruktor zu entfernen und CBEntity **pEntity; erstmal auf NULL setzen. Erst wenn das Objekt erstellt ist &quot;XXX:CreateEntities&quot; über pXXX aufrufen.<br />
Das dürfte doch klappen, oder?</p>
</blockquote>
<p>Möglich, wäre aber genauso übler Stil.</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<p>Das wird wohl stimmen. Allerdings wüsste ich nicht, wie ich das Problem anders lösen sollte. Nebenbei bemerkt bin ich noch relativ am Anfang mit C++.</p>
</blockquote>
<p>Ich würde dir dringend raten, dir fürs Erste eine einfachere Aufgabe zu suchen, bis du das Handwerkszeug drauf hast.</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<p>Wie soll ich denn diese globalen Variablen umgehen? Zumindest<br />
[/cpp]CEntitySortCount *pEntities;<br />
XXX *pXXX;[cpp]</p>
<p>werden sehr oft gebraucht. Ich könnte sie natürlich &quot;thematisch&quot; in einer extra Klasse zusammenfassen, allerdings fände ich das auch nicht gerade übersichtlich.</p>
</blockquote>
<p>Ich sehe ja ein, dass man manche Dinge global verfügbar haben möchte. Dafür gibt's das Singleton-Pattern. Aber wenn schon eine globale Variable, warum dann auch noch als Zeiger? Damit man die extra noch initialisieren muss? Damit noch mehr schiefgehen kann?</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<p>Das mit dem &quot;Zeigergehampel&quot; kann ich verstehen. Aber das ist alles ziemlich abhängig von den Eingaben des benutzers, desswegen habe ich es so gemacht.</p>
</blockquote>
<p>Schau dir bitte mal std::vector und die anderen Container der Standardbibliothek an. Auf Zeiger auf irgendwelche dynamisch alloziierten Arrays kann man eigentlich immer verzichten, und statt dessen einen Container nehmen.</p>
<p>Schwierig wird es immer dann, wenn die Besitzverhältnisse der Klassen nicht geklärt sind, aber dann ist schon beim Design etwas schiefgelaufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653924</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 28 Jan 2009 15:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 21:15:20 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Möglich, wäre aber genauso übler Stil.</p>
</blockquote>
<p>Naja, dann muss ich da wohl noch einiges verbessern.</p>
<blockquote>
<p>Schau dir bitte mal std::vector und die anderen Container der Standardbibliothek an. Auf Zeiger auf irgendwelche dynamisch alloziierten Arrays kann man eigentlich immer verzichten, und statt dessen einen Container nehmen.</p>
</blockquote>
<p>Ich wollte eigentlich erstmal auf diese eingebauten Strukturen verzichten und erstmal das Grundlegende lernen. Diese Container bauen doch darauf auf, oder? Und ich möchte ungern irgendwelche vorgefertigten Strukturen verwenden, wo ich gar nicht richtig weis, wie das alles hintendran abläuft.(Ich bin überzeugt, dass diese sehr praktisch sind)</p>
<p>Edit: Also diese globalen Zeigervariablen sind wirklich unnötig riskant. Diese kann ich relativ leicht umgehen. Die sonstigen globalen Variablen werde ich wahrscheinlich anderweitig verpacken. Die restliche Struktur gefällt mir eigentlich ganz gut, ich werde deine Ratschläge aber beherzigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654080</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 28 Jan 2009 21:15:20 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 21:14:45 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Ich sehe ja ein, dass man manche Dinge global verfügbar haben möchte. Dafür gibt's das Singleton-Pattern.</p>
</blockquote>
<p>Das Singleton-Pattern ist eher dazu gedacht, eine Klasse höchstens einmal zu instanziieren, als als Ersatz für globale Variablen.</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Schwierig wird es immer dann, wenn die Besitzverhältnisse der Klassen nicht geklärt sind, aber dann ist schon beim Design etwas schiefgelaufen.</p>
</blockquote>
<p>Muss nicht sein. Wenn sich mehrere Objekte einen Besitz teilen, rät sich zum Beispiel <code>std::tr1::shared_ptr</code> .</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<p>Ich wollte eigentlich erstmal auf diese eingebauten Strukturen verzichten und erstmal das Grundlegende lernen. Diese Container bauen doch darauf auf, oder? Und ich möchte ungern irgendwelche vorgefertigten Strukturen verwenden, wo ich gar nicht richtig weis, wie das alles hintendran abläuft.(Ich bin überzeugt, dass diese sehr praktisch sind)</p>
</blockquote>
<p>Für den Anfang ist es sicher nicht schlecht, wenn man selber ein wenig herumexperimentiert. Allerdings würde ich dann das als einzelne Teilaufgabe angehen, die Thematik ist komplex genug.</p>
<p>Mit der Zeit kannst du aber ohne schlechtes Gewissen die Standardbibliothek einsetzen. Bis man besser als die STL programmiert, braucht es schon etwas. Es gehören ja nicht nur Container selbst dazu, da kommen die ganzen Iteratoren- und Algorithmengeschichten, und so weiter. Dazu kommt, dass diese bereits getestet, weitgehend fehlerfrei und auch relativ gut optimiert sind. Du tust dir wirklich keinen Gefallen, wenn du dir alles selbst programmieren willst.</p>
<p>Aber wie gesagt: Um die Sache zu verstehen, ist das kein Problem. Nur sollte man erkennen, wann es Zeit ist, umzusteigen...:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654086</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 28 Jan 2009 21:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler im Konstruktor der Basisklasse on Wed, 28 Jan 2009 21:35:37 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber wie gesagt: Um die Sache zu verstehen, ist das kein Problem. Nur sollte man erkennen, wann es Zeit ist, umzusteigen...:)</p>
</blockquote>
<p>So sollte es auch sein. Ich möchte mir auch nicht alles selbst programmieren, aber da dies mein erstes etwas umfangreicheres Projekt sein wird, möchte ich hier versuchen, das ein oder andere umzusetzen. Ob das jetzt an der einen oder anderen Stelle nicht ganz so professionell hin haut, ist natürlich klar. Aber als Übung sit es doch bestimmt nicht falsch. Dann merkt man auch, wann man was machen bzw. besser lassen sollte. (siehe globale Zeigervariable...habe ich heute was dazu gelernt)</p>
<p>Die Container werde ich mir an späterer Stelle bestimmt anschauen und dann auch verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654100</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 28 Jan 2009 21:35:37 GMT</pubDate></item></channel></rss>