<?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[Globales erstellen einer Klasseninstanz]]></title><description><![CDATA[<p>Hi.</p>
<p>Ich bin grade dabei mich in C++ reinzuarbeiten und habe dabei folgendes Problem:<br />
Ich bin dabei mir zur Übung einen kleinen ASCII basierten Dungeoncrawler zu schreiben. Hierbei habe ich eine Klasse &quot;game_engine&quot;, welche von allen anderen Klassen Instanzen erzeugt und diese verwaltet. Es werden unter anderem auch die Klassen &quot;map&quot; für die Karte der Spielwelt und mehrere Klassen für einzelne Objekte erzeugt.</p>
<p>Das Problem ist nun, dass ich nicht weiß, wie ich 2 von der game_engine erzeugte Klassen miteinander kommunizieren lassen kann. In meinem konkreten Fall will ich, dass jede Einheit selber auf die Klasse map zugreifen, im Falle einer Bewegung die Koordinaten umliegender Felder abrufen und ihre eigene Position updaten sowie anschließend die Karte neu zeichnen kann. Dies kriege ich allerdings nicht hin, da beide Klassen von der game_engine erzeugt werden und so keinen Zugriff aufeinander haben.<br />
Meine Idee war nun, die map Klasse sozusagen global zu erzeugen, so dass jede andere Klasse daran Änderungen vornehmen kann. Ich weiß allerdings nicht wie ich das codetechnisch umsetzen soll.</p>
<p>Weiß jemand, wie ich das hinkiegen kann? Bin für jeden Tipp dankbar.</p>
<p>mfg Asgalor</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294810/globales-erstellen-einer-klasseninstanz</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 17:24:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294810.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Nov 2011 20:23:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Globales erstellen einer Klasseninstanz on Tue, 01 Nov 2011 20:23:15 GMT]]></title><description><![CDATA[<p>Hi.</p>
<p>Ich bin grade dabei mich in C++ reinzuarbeiten und habe dabei folgendes Problem:<br />
Ich bin dabei mir zur Übung einen kleinen ASCII basierten Dungeoncrawler zu schreiben. Hierbei habe ich eine Klasse &quot;game_engine&quot;, welche von allen anderen Klassen Instanzen erzeugt und diese verwaltet. Es werden unter anderem auch die Klassen &quot;map&quot; für die Karte der Spielwelt und mehrere Klassen für einzelne Objekte erzeugt.</p>
<p>Das Problem ist nun, dass ich nicht weiß, wie ich 2 von der game_engine erzeugte Klassen miteinander kommunizieren lassen kann. In meinem konkreten Fall will ich, dass jede Einheit selber auf die Klasse map zugreifen, im Falle einer Bewegung die Koordinaten umliegender Felder abrufen und ihre eigene Position updaten sowie anschließend die Karte neu zeichnen kann. Dies kriege ich allerdings nicht hin, da beide Klassen von der game_engine erzeugt werden und so keinen Zugriff aufeinander haben.<br />
Meine Idee war nun, die map Klasse sozusagen global zu erzeugen, so dass jede andere Klasse daran Änderungen vornehmen kann. Ich weiß allerdings nicht wie ich das codetechnisch umsetzen soll.</p>
<p>Weiß jemand, wie ich das hinkiegen kann? Bin für jeden Tipp dankbar.</p>
<p>mfg Asgalor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2138969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2138969</guid><dc:creator><![CDATA[Asgalor]]></dc:creator><pubDate>Tue, 01 Nov 2011 20:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Globales erstellen einer Klasseninstanz on Tue, 01 Nov 2011 23:32:17 GMT]]></title><description><![CDATA[<p>Also es gibt viele Möglichkeiten, es kommt darauf an, was für Kommunikationen du tatsächlich umsetzen möchtest, also wer mit wem zu welchem Zweck kommuniziert. Kam für mich nicht wirklich raus, könntest Du das nochmal beschreiben?</p>
<p>Du könntest z.B. für umliegende Felder den jeweiligen Klassen Zeiger übergeben. Oder Du sorgst dafür, dass die Objekte sich nicht gegenseitig können müssen, sondern die Verwaltung in einer verwaltenden Klasse (game_engine oder noch eine Ebene zwischen game_engine und map) geschieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139063</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 01 Nov 2011 23:32:17 GMT</pubDate></item><item><title><![CDATA[Reply to Globales erstellen einer Klasseninstanz on Wed, 02 Nov 2011 06:59:28 GMT]]></title><description><![CDATA[<p>Asgalor schrieb:</p>
<blockquote>
<p>In meinem konkreten Fall will ich, dass jede Einheit selber auf die Klasse map zugreifen, im Falle einer Bewegung die Koordinaten umliegender Felder abrufen und ihre eigene Position updaten sowie anschließend die Karte neu zeichnen kann.</p>
</blockquote>
<p>Also zunächst mal : Das sind viel zu viele Aufgaben für eine Klasse. Eine Einheit sollte sich auf die Verwaltung der Eigenschaften einer Einheit konzentrieren und sich nicht um das Zeichnen der Karte kümmern.<br />
Aber um mal einen Eindruck zu bekommen, wie man dein Problem (das gar nicht das eigentliche Problem ist, aber vom Prinzip dennoch häufig vorkommt) ganz einfach löst.</p>
<pre><code class="language-cpp">class Map;
class Einheit
{
public:
  Einheit(Map&amp; m) : map_(&amp;m) {}

  void Update()
  {
    Move();
    map_-&gt;Update();
  }

private:
  Map* map_;
};

class Engine
{
public:
  Engine() :
    map_(),
    einheitA_(map_),
    einheitB_(map_)
  {}

private:
  Map map_;
  Einheit einheitA_, einheitB_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2139109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139109</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 02 Nov 2011 06:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Globales erstellen einer Klasseninstanz on Thu, 03 Nov 2011 04:35:13 GMT]]></title><description><![CDATA[<p>Danke für die beiden Antworten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22559">@Eisflamme</a>: Da hab ich mich vermutlich nicht genau genug ausgedrückt. Ich meinte eigentlich, dass jede Einheit ihre Position auf der Karte selbst updaten kann und die Karte sich danach selbst aktualisiert.</p>
<p>Konkret hab ich folgendes Problem: Klasse A erzeugt die Klassen B,C,D und E. Wie kann ich von C,D und E auf B zugreifen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: Die Idee ist also einfach beim erzeugen jeder Einheit eine Referenz auf die Kate mitzugeben? Klingt einfach und effizient. Werd das heut abend mal ausprobieren.</p>
<p>Edit: Habs ausprobiert und nach etwas rumgefriemel auch in meinem Quellcode zum laufen bekommen. Danke also schonmal soweit. <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>Bei mir tritt nun aber ein neues Problem auf. Ich habe jetzt einen Pointer auf meine Karte an meine Einheit übergeben</p>
<pre><code class="language-cpp">game_engine::game_engine()
{
	aAusgabe = ausgabe(dDungeon.giveMap());
	pPlayer = player(100, tmpvector, &amp;aAusgabe);	
}

player::player(int hitpoints, vector&lt;int&gt; pos, ausgabe *map)
{
}
</code></pre>
<p>Solange ich mich noch im Konstruktor von player befinde ist alles in Ordnung. Sobald ich aber durch eine Funktion von player versuche auf meine Karte lesend oder schreibend zuzugreifen, bekomme ich eine Zugriffsverletzung.</p>
<pre><code class="language-cpp">void player::move(int direction)
{
	vector&lt;int&gt; iTempPos(2);
	switch(direction)
	{
	case 1:		
		iTempPos[0] = viPos[0];
		iTempPos[1] = viPos[1]-1;
		break;
	case 2:
		iTempPos[0] = viPos[0]+1;
		iTempPos[1] = viPos[1];
		break;
	case 3:
		iTempPos[0] = viPos[0];
		iTempPos[1] = viPos[1]+1;		
		break;
	case 4:
		iTempPos[0] = viPos[0]-1;
		iTempPos[1] = viPos[1];
		break;
	default:
		break;
	}
	if(map -&gt; checkMovement(iType,iTempPos) == 0) //Zugriffsverletzung
		{
			changePosition(iTempPos); 
		}
}
</code></pre>
<p>Ich hab auch schon versucht eine public Variable der Karte zu ändern oder andere Funktionen aufzurufen. Führt leider alles zum selben Fehler.<br />
Wenn ich allerdings dieselben Funktionen aus meiner game_engine Klasse, welche die anderen beiden Klassen erzeugt, aufrufe, klappt alles tadellos.</p>
<p>Hat hier noch jemand eine Idee? Bin langsam echt ratlos....</p>
<p>Edit2:</p>
<p>Ich seh grad, dass meine Entwicklungsumgebung, VisualStudio 2010, mir noch 2<br />
Infos zu der Zugriffsverletzung ausspuckt. Der Fehler tritt im Code erst dann auf, wenn innerhalb der aufgerufenen Funktion auf einen meiner Vektoren zugegriffen wird.<br />
Dabei spuckt mir meine Umgebung dann</p>
<pre><code class="language-cpp">[size]	CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden	
[capacity]	CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
</code></pre>
<p>in der vector Datei aus. Also die aus dem Standardrepertoire.</p>
<p>Edit3: Hat sich. War eine ziemlich doofe Verwechslung von Variabelnamen. Hab in meiner Ausgabe auf den übergebenen Parameter &quot;map&quot; zugegriffen statt auf die von mir angelegte Variable vMap. Dadurch hatte ich natürlich Probleme sobald ich aus dem Konstuktor raus war, da der Parameter da ja nicht mehr gültig war....... <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>
<p>Sonst klappt jetzt alles soweit. Danke euch Beiden für eure 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/2139304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139304</guid><dc:creator><![CDATA[Asgalor]]></dc:creator><pubDate>Thu, 03 Nov 2011 04:35:13 GMT</pubDate></item></channel></rss>