<?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[Pointer auf abstrakte KLassen]]></title><description><![CDATA[<p>Hi Forum,<br />
ich versuche gerade ein Design(Strategy)Patternzu implementiern. was unegfähr wie folgt aussieht</p>
<pre><code>class AbstractStrategy
{
    public:
        virtual void test() = 0;
};
</code></pre>
<pre><code>class Strategy1 : public AbstractStrategy
{
public:
    virtual void test(){ cout &lt;&lt; &quot;Strat1\n&quot;}
    Strategy1();
};
</code></pre>
<pre><code>class Strategy2 : public AbstractStrategy
{
public:
    virtual void test(){ cout &lt;&lt; &quot;Strat2\n&quot;}
};
</code></pre>
<p>Sieht die Main wie folgt aus funktioniert auch alles wunderbar</p>
<pre><code>int main()
{
  Strategy1 s1();
  Strategy2 s2();
  AbstractStrategy * pToStrat = &amp;s1;
  pToStrat-&gt;test();
  pToStrat = &amp;s2;
  pToStrat-&gt;test();
}
</code></pre>
<p>Sooo nun kommt Code der nicht funktioniert</p>
<pre><code>//Global
AbstractStrategy * pToStrat;
void initStrat()
{
  AbstractStrategy * pToStrat = new Strategy1();
}
int main()
{
  initStrat();
  pToStrat-&gt;test();
}
</code></pre>
<p>Ich denke mal der Code funktioniert nicht, weil in der Funktion initStrat der Pointer auf ein Objekt verwiesen wird, das aber nur innerhalb vin initStrat() existiert.</p>
<p>Meine Frage ist also, wie kann ich es schaffen, dass mein Pointer hinterher auf ein &quot;ordentliches&quot; Objekt zeigt, welches ich in einer anderen Funktion/Methode erstellt habe ?<br />
Ich danke schonmal in voraus</p>
<p>Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242824/pointer-auf-abstrakte-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 18:19:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242824.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Jun 2009 15:34:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 15:34:40 GMT]]></title><description><![CDATA[<p>Hi Forum,<br />
ich versuche gerade ein Design(Strategy)Patternzu implementiern. was unegfähr wie folgt aussieht</p>
<pre><code>class AbstractStrategy
{
    public:
        virtual void test() = 0;
};
</code></pre>
<pre><code>class Strategy1 : public AbstractStrategy
{
public:
    virtual void test(){ cout &lt;&lt; &quot;Strat1\n&quot;}
    Strategy1();
};
</code></pre>
<pre><code>class Strategy2 : public AbstractStrategy
{
public:
    virtual void test(){ cout &lt;&lt; &quot;Strat2\n&quot;}
};
</code></pre>
<p>Sieht die Main wie folgt aus funktioniert auch alles wunderbar</p>
<pre><code>int main()
{
  Strategy1 s1();
  Strategy2 s2();
  AbstractStrategy * pToStrat = &amp;s1;
  pToStrat-&gt;test();
  pToStrat = &amp;s2;
  pToStrat-&gt;test();
}
</code></pre>
<p>Sooo nun kommt Code der nicht funktioniert</p>
<pre><code>//Global
AbstractStrategy * pToStrat;
void initStrat()
{
  AbstractStrategy * pToStrat = new Strategy1();
}
int main()
{
  initStrat();
  pToStrat-&gt;test();
}
</code></pre>
<p>Ich denke mal der Code funktioniert nicht, weil in der Funktion initStrat der Pointer auf ein Objekt verwiesen wird, das aber nur innerhalb vin initStrat() existiert.</p>
<p>Meine Frage ist also, wie kann ich es schaffen, dass mein Pointer hinterher auf ein &quot;ordentliches&quot; Objekt zeigt, welches ich in einer anderen Funktion/Methode erstellt habe ?<br />
Ich danke schonmal in voraus</p>
<p>Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723362</guid><dc:creator><![CDATA[TrixTrax]]></dc:creator><pubDate>Mon, 08 Jun 2009 15:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 15:43:00 GMT]]></title><description><![CDATA[<p>TrixTrax schrieb:</p>
<blockquote>
<p>...<br />
Sieht die Main wie folgt aus funktioniert auch alles wunderbar</p>
<pre><code>int main()
{
  Strategy1 s1();
  Strategy2 s2();
...
</code></pre>
</blockquote>
<p>Glaube ich nicht.</p>
<p>Es hilft nichts, wenn Du 2 Funktionen definierst, die keinen Parameter haben und ein Strategy1-(bzw.2)-Objekt zurückgeben. Das wird Dir auch Dein Compiler ankreiden .... <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>und gleich die 2 Standardhinweise:<br />
1.) Nimm doch bitte die cpp-Tags ...<br />
2.) &quot;funktioniert nicht&quot; ist keine Fehlerbeschreibung.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723365</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 08 Jun 2009 15:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 15:43:10 GMT]]></title><description><![CDATA[<p>TrixTrax schrieb:</p>
<blockquote>
<p>Sooo nun kommt Code der nicht funktioniert<br />
...<br />
Ich denke mal der Code funktioniert nicht, weil in der Funktion initStrat der Pointer auf ein Objekt verwiesen wird, das aber nur innerhalb vin initStrat() existiert.</p>
</blockquote>
<p>Ganz davon abgesehen, das man globale Variablen möglichst meiden sollte... (Und du auch das Objekt am Schluss wieder löschen solltest).</p>
<p>Du deklarierst hier zwei verschiedene Variablen, die nichts miteinander zu tun haben:</p>
<pre><code class="language-cpp">//Global
AbstractStrategy * pToStrat; // Globale Variable
void initStrat()
{
    // Lokale Variable:
    AbstractStrategy * pToStrat = new Strategy1();
}
</code></pre>
<p>Wenn du die Globale setzen willst:</p>
<pre><code class="language-cpp">//Global
AbstractStrategy * pToStrat;
void initStrat()
{
    pToStrat = new Strategy1();
}
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723366</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 08 Jun 2009 15:43:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 15:45:39 GMT]]></title><description><![CDATA[<p>Oder gleich:</p>
<pre><code class="language-cpp">AbstractStrategy* initStrat()
{
    static AbstractStrategy * pToStrat = new Strategy1();
    return pToStrat
}
</code></pre>
<p>Inkl. aller Probleme von &quot;Singletons und Singletonartigen&quot;...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723367</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 08 Jun 2009 15:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 16:19:30 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Inkl. aller Probleme von &quot;Singletons und Singletonartigen&quot;...</p>
</blockquote>
<p>Und mit dynamischer Speicherverwaltung. Gerade im Zusammenhang mit <code>static</code> ist die Frage sehr heikel, wer den Speicher freigibt. Also wenns geht auf dem Stack (bzw. statischem Speicherbereich bei <code>static</code> ) arbeiten, RAII nutzen, oder wenigstens manuell freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723391</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Jun 2009 16:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Mon, 08 Jun 2009 16:44:50 GMT]]></title><description><![CDATA[<p>Erstmal danke für die Antworten <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>Ja das Programm sieht nicht 100%tig so aus, ich dachte nur so wäre mein Problem einfacher zu verstehen.<br />
Und bei dieser Abstraktion habe ich selber einen Fehler reingebaut, bezüglich global bzw. lokal. Bevor mir noch mehr Fehler unterlaufen. Hier vielleicht Auszüge aus dem original Code.</p>
<p>So also einmal das &quot;Interface&quot;</p>
<pre><code class="language-cpp">#ifndef _ABSTRACTCOLLITIONDETECTION_H
#define	_ABSTRACTCOLLITIONDETECTION_H

#include &lt;GL/glut.h&gt;

class AbstractCollisionReactor
{
    public:
        virtual void react(GLfloat **array, void* comp) = 0;
};

#endif	/* _ABSTRACTCOLLITIONDETECTION_H */
</code></pre>
<p>Diese Abstrakte Klasse/Interface wird von einer weiteren Klasse verwendet</p>
<pre><code class="language-cpp">class Component
{
    protected:
        AbstractCollisionReactor * collisionReactor;
        MyVertex center;
.
.
.
public:
        Component(GLint type, GLint numberOfVertics, GLint typeOfReactor)
        {
          .
          .
          .
          switch(typeOfReactor)
          {
            case 0:
                collisionReactor = new WallCollisionReactor();
                //Testen des Patterns. Funktioniert
                collisionReactor-&gt;react(NULL, NULL);
             break;

            case 1:
               collisionReactor = new EnemyCollisionReactor();
                //Testen des Patterns.  Funktioniert
                collisionReactor-&gt;react(NULL, NULL);
            break;
         }
       }
        void react(GLfloat** array, Component *comp)
         {
            collisionReactor-&gt;react(array, comp);
         }
};
</code></pre>
<p>So im switch case &quot;teste&quot; ich ja das mit den Stratgey. Und das funktioniert auch einwandfrei, es erscheint meine eigene Fehlermeldung, dass die Parameter null sind und als Zusatz lasse ich mir ausgeben welches Pattern gerade verwendet wird (also einfaches cout in den konkreten Klassen).</p>
<p>Sooo und zum Thema es funktioniert nicht ist keine Beschreibung:</p>
<p>Komme ich nun bei der Collision Detection zur Stelle</p>
<pre><code class="language-cpp">for (int counter = 0; counter &lt; numberOfComponents; counter++)
{
  if(doCollide(arrayOfComponents[counter], gamer)
  {
     cout &lt;&lt; &quot;Aua\n&quot; ;
     arrayOfComponents[counter].react(informationArray, gamer);
     cout &lt;&lt; &quot;Du hast mich getroffen\n&quot; ;
  }
}
</code></pre>
<p>Erscheint noch auf meiner Console:<br />
Aua<br />
SegmentationFault</p>
<p>Ich habe auch einfach mal nur couts verwendet in den Methoden react() von Wall- bzw EnemyCollisionReactor, um auszuschließen, dass ich nicht so einen Fehler verursache. Das Ergebnis bleibt das gleiche. Auch mit dem Debugger komme ich nur bis collisionReactor-&gt;react(array, comp); Innerhalb der Methode react() der Component Klasse.</p>
<p>Erstmal Entschuldigung, dass ich nicht sofort mit dem richtigen Code rausgerückt habe.</p>
<p>MfG Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723409</guid><dc:creator><![CDATA[TrixTrax]]></dc:creator><pubDate>Mon, 08 Jun 2009 16:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Tue, 09 Jun 2009 10:49:41 GMT]]></title><description><![CDATA[<p>Und &quot;arrayOfComponents[counter]&quot; ist zum Zeitpunkt des react-Aufrufs noch i.O.?<br />
Denn wenn der react-Aufruf zum segfault führt, egal was du da drinnen machst, deutet das eigentlich darauf hin...<br />
Ist arrayOfConmponents ein ARRAY oder eine std::list, bzw. std::vector?<br />
Falls ein Array, wäre es angebracht, mal ne liste zu verwenden, und vor dem Zugriff auf das [conter]'te Objekt zu prüfen ob du nicht schon outOfRange bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723760</guid><dc:creator><![CDATA[tandem]]></dc:creator><pubDate>Tue, 09 Jun 2009 10:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf abstrakte KLassen on Tue, 09 Jun 2009 11:30:43 GMT]]></title><description><![CDATA[<p>Ist Dein Destruktor <code>virtual</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723797</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 09 Jun 2009 11:30:43 GMT</pubDate></item></channel></rss>