<?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[Zur Laufzeit mehrere Instanzen erstellen]]></title><description><![CDATA[<p>Hi, ich stehe hier vor einem Problem, was ich seit mehreren Monaten noch nicht lösen konnte, und zwar geht es darum, dass ich so eine Art &quot;Level-Editor&quot; programmiere. Wenn man im Menü auf &quot;Spieler erstellen&quot; geht, dann kann man den Spieler setzen (natürlich nur einmal möglich). Wenn ich jetzt aber Wände setzen will, dann möchte ich auch mehrere haben. Also das Programm ist WinAPI mit einer GUI, aber ich stelle den Code nur teilweise herein, weil er einfach zu lang ist:</p>
<p>Globaler Gültigkeitsbereich:</p>
<pre><code class="language-cpp">class CObjekt
{
    private:
         ...
    public:
         ...
};
...

CObjekt *pSpieler = NULL;
CObjekt *pWand = NULL;
</code></pre>
<p>Beim erstellen vom Spieler:</p>
<pre><code class="language-cpp">pSpieler = new CObjekt(hInst);
</code></pre>
<p>Beim erstellen der Wand:</p>
<pre><code class="language-cpp">pWand = new CObjekt(hInst);
</code></pre>
<p>hInst ist hier einfach nur ein Parameter, dem ich den Konstruktor gebe, weil eine bestimmte Funktion die hInstance braucht.</p>
<p>Das Problem, was mir auch sofort klar war:</p>
<p>Ich überschreibe den Zeiger, wenn ich ein 2. Wandobjekt erstellen möchte. Wie kann ich es hinkriegen, ein 2. Objekt, 3., 4. ,usw. zur Laufzeit zu erstellen.</p>
<p>Ich habe es mit nem Array versucht, aber dazu müsste ich den hInst Parameter entfernen, was leider nicht geht!</p>
<p>mfg Nolf</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202463/zur-laufzeit-mehrere-instanzen-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 17:03:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202463.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jan 2008 18:34:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Fri, 11 Jan 2008 18:34:25 GMT]]></title><description><![CDATA[<p>Hi, ich stehe hier vor einem Problem, was ich seit mehreren Monaten noch nicht lösen konnte, und zwar geht es darum, dass ich so eine Art &quot;Level-Editor&quot; programmiere. Wenn man im Menü auf &quot;Spieler erstellen&quot; geht, dann kann man den Spieler setzen (natürlich nur einmal möglich). Wenn ich jetzt aber Wände setzen will, dann möchte ich auch mehrere haben. Also das Programm ist WinAPI mit einer GUI, aber ich stelle den Code nur teilweise herein, weil er einfach zu lang ist:</p>
<p>Globaler Gültigkeitsbereich:</p>
<pre><code class="language-cpp">class CObjekt
{
    private:
         ...
    public:
         ...
};
...

CObjekt *pSpieler = NULL;
CObjekt *pWand = NULL;
</code></pre>
<p>Beim erstellen vom Spieler:</p>
<pre><code class="language-cpp">pSpieler = new CObjekt(hInst);
</code></pre>
<p>Beim erstellen der Wand:</p>
<pre><code class="language-cpp">pWand = new CObjekt(hInst);
</code></pre>
<p>hInst ist hier einfach nur ein Parameter, dem ich den Konstruktor gebe, weil eine bestimmte Funktion die hInstance braucht.</p>
<p>Das Problem, was mir auch sofort klar war:</p>
<p>Ich überschreibe den Zeiger, wenn ich ein 2. Wandobjekt erstellen möchte. Wie kann ich es hinkriegen, ein 2. Objekt, 3., 4. ,usw. zur Laufzeit zu erstellen.</p>
<p>Ich habe es mit nem Array versucht, aber dazu müsste ich den hInst Parameter entfernen, was leider nicht geht!</p>
<p>mfg Nolf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435062</guid><dc:creator><![CDATA[Nolf]]></dc:creator><pubDate>Fri, 11 Jan 2008 18:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Fri, 11 Jan 2008 18:59:34 GMT]]></title><description><![CDATA[<p>Doch, für mehrere Instanzen benötigst du einen geeigneten Containertypen (z.B. std::vector, std::list oder auch (konstantgroße) Arrays).<br />
Und du kannst jedem Objekt trotzdem einen oder mehrere Parameter übergeben:</p>
<pre><code class="language-cpp">std::vector&lt;CObjekt&gt; vec;

vec.push_back(CObject(hInst));
</code></pre>
<p>Wenn dein Objekt nicht kopierbar ist bzw. du Polymorphie (Klassen-Hierarchien)einsetzt, dann solltest du allerdings Zeiger verwenden:</p>
<pre><code class="language-cpp">typedef std::vector&lt;CObjekt *&gt; ObjVec; // um weniger schreiben zu müssen
ObjVec vec;

vec.push_back(new CObject(hInst));

// Freigabe der Objekte nicht vergessen (sobald sie nicht mehr benötigt werden)
for(ObjVec::iterator it = vec.begin(); it != vec.end(); ++it)
  delete *it;
</code></pre>
<p>Aber ich denke, dir fehlen generell noch ein paar Grundlagen (zumindestens, um gleich einen Level-Editor zu basteln).<br />
Arbeite erst einmal aus einen Tutorial oder Buch deiner Wahl mal die Standardcontainer durch (diese wirst du für fast jedes C++ Programm benötigen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435078</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 11 Jan 2008 18:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Fri, 11 Jan 2008 20:20:25 GMT]]></title><description><![CDATA[<p>Ich hab ein Buch, und die generellen Grundlagen habe ich ja drauf, aber nicht diese fortgeschrittenen, wie diese Vektoren aus der STL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435087</guid><dc:creator><![CDATA[Nolf]]></dc:creator><pubDate>Fri, 11 Jan 2008 20:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Fri, 11 Jan 2008 20:21:12 GMT]]></title><description><![CDATA[<p>Ich habe dann aber dazu mal eine Frage. Wenn ich jetzt das Objekt zeichnen will, tritt ein Fehler auf (ich sehe ihn nichtmal) und das Programm wird beendet.</p>
<p>Hier mal der Code:</p>
<pre><code class="language-cpp">case WM_PAINT:
{
...
	vec.at(AnzahlWandObjekte)-&gt;OnDraw(hdc, hbmWall);
...
} break;
</code></pre>
<p>Beim erstellen des Objektes:</p>
<pre><code class="language-cpp">case IDM_SET_WALL:
	pWand = new CObjekt(hInst);
	vec.push_back(pWand);
	AnzahlWandObjekte = vec.size();
	break;
</code></pre>
<p>Das gleiche tritt auch auf, wenn ich statt den ersten beiden Zeilen deinen Code benutze:</p>
<pre><code class="language-cpp">vec.push_back(&amp;CObjekt(hInst));
</code></pre>
<p>Wie mache ich das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435125</guid><dc:creator><![CDATA[Nolf]]></dc:creator><pubDate>Fri, 11 Jan 2008 20:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Fri, 11 Jan 2008 22:21:32 GMT]]></title><description><![CDATA[<p>Bist du im Debugmode? Was wird dir denn beim Absturz für ne Meldung angezeigt???</p>
<p>Wird höchst wahrscheinlich eine out_of_range-Exception fliegen. Denn <a href="http://vec.at" rel="nofollow">vec.at</a>(AnzahlWandObjekte) dürfte einfach falsch sein! Wenn der Vector z.B. 10 groß ist, kannst du nicht auf Index 10 zugreifen, weil immer bei 0 angefangen wird zu zählen!</p>
<p><a href="http://vec.at" rel="nofollow">vec.at</a>(AnzahlWandObjekte - 1) wäre schlauer. Wobei ich mich frage, warum du nicht einfach <a href="http://vec.at" rel="nofollow">vec.at</a>( vec.size() - 1) machst, wenn du eh immer nur das letzte Element haben willst?</p>
<pre><code class="language-cpp">case WM_PAINT:
{
...
    try
    {
         vec.at(AnzahlWandObjekte)-&gt;OnDraw(hdc, hbmWall);
    }
    catch(const std::out_of_range &amp;e)
    {
        // hier den Fehler behandeln...
    }
...
} break;
</code></pre>
<p>Tip: <a href="http://www.kharchi.eu/wiki/doku.php?id=cpp:std:exception" rel="nofollow">http://www.kharchi.eu/wiki/doku.php?id=cpp:std:exception</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435165</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 11 Jan 2008 22:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zur Laufzeit mehrere Instanzen erstellen on Sat, 12 Jan 2008 11:46:04 GMT]]></title><description><![CDATA[<p>Hmm ja daran lags wohl (out of range).<br />
Ich habe das Problem gerstern um 23 uhr noch selbst gelöst! <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="🙂"
    /><br />
Vielen Dank für eure hilfe (dieser Denkanstoß hat mir wirklich geholfen), denn auf Vektoren wäre ich so schnell nicht gekommen. Ich kann nämlich komischerweise <strong>nicht</strong> AnzahlWandObjekte benutzen, denn dann kommt der Fehler. Ich muss immer eine for-Schleife benutzen:</p>
<p>(Beim WM_PAINT ist es ja klar, weil er ja alles Zeichnen soll):</p>
<pre><code class="language-cpp">if(AnzahlObjekte&gt;0)
{
	for(int i=0; i&lt;AnzahlObjekte; i++)
	vec.at(i)-&gt;OnDraw(hdc);
}
</code></pre>
<p>Aber bei normalen Aktionen, wo nur eins dieser Objekte benutzt wird, muss ich trotzdem eine for-Schleife benutzen:</p>
<pre><code class="language-cpp">case WM_RBUTTONDOWN:
    if(AnzahlObjekte&gt;0)
    {
        for(int i=0; i&lt;AnzahlObjekte; i++)
        {
            if(vec.at(i)-&gt;CheckCollision(MouseX, MouseY))
            {
                vec.pop_back();
                AnzahlObjekte = vec.size();
            }
        }
    }
    break;
</code></pre>
<p>mfg Nolf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435320</guid><dc:creator><![CDATA[Nolf]]></dc:creator><pubDate>Sat, 12 Jan 2008 11:46:04 GMT</pubDate></item></channel></rss>