<?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[Instanz einer Klasse an Funktion anderer Klasse übergeben]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche mich gerade an einem kleinen Spiel mit der SDL und C++.<br />
Ist das 1., das ich schreibe und benutzte das ganze damit auch zum Lernen...</p>
<p>Hab jetzt aber eine Frage und zwar:</p>
<p>Ich habe bisher 2 Klassen geschrieben, 1 für die Grafik und 1 namens &quot;Spieler&quot;, in der bisher die Koordinaten des Spielers stehen.<br />
Im Hauptcode erstelle ich nun eine Instanz von beidem und möchte nun eine Funktion der Grafikklasse aufrufen und dieser als Parameter den &quot;Spieler1&quot; geben (die Instanz der Spielerklasse).<br />
Dafür hab' ich einen Pointer vom Typ &quot;Spieler&quot;, der auf die Instanz &quot;Spieler1&quot; zeigt.<br />
Den übergeb' ich. Jetzt wollte ich in der Grafikklasse diesen Pointer deklarieren/anmelden, bekomm' da aber immer eine Fehlermeldung &quot;ISO C++ forbids declaration of &quot;Spieler&quot; with no type.<br />
Was ist da wohl das Problem?</p>
<p>Ich habe die &quot;spieler.hpp&quot; der Spielerklasse nur in der main-Datei inkludiert, wenn ich die auch noch in der Grafikklasse in den Header stecke, bekomme ich den Fehler, dass die Klasse 2x definiert wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Weiß jemand weiter?</p>
<p>Hier bisschen Code:</p>
<p>main:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;SDL/SDL.h&quot;
#include &quot;grafik.hpp&quot;
#include &quot;spieler.hpp&quot;

//zum Code testen: www.codepad.org

using namespace std;

//The attributes of the screen
const int SCREEN_WIDTH = 1200;  // Hier wird die Größe des Ausgabebildschirms festgelegt....
const int SCREEN_HEIGHT = 800;
const int SCREEN_BPP = 32;  //SCREEN_BPP is the bits per-pixel. In all of the tutorials, 32-bit color will be used.

float time1, time2, time_gesamt;
int test;
int contador1=0;
bool game=true;

SDL_Surface *screen, *osito_vorne = NULL; // Pointer auf Null setzen
SDL_Rect dest2;
SDL_Event event;
Uint8 *keys;
Spieler *p_Spieler1 = NULL;

 int main( int argc, char* args[] ) // SDL brauch diese Parameter
{
    cout &lt;&lt; &quot;hallo&quot; &lt;&lt; endl; // Wie schreib ich in die Konsole? -&gt; SDL leitet das ganze in eine Textdatei um, die sich im bin-Ordner befindet

    // INITIALISIERUNG VON SDL
    if (SDL_Init ( SDL_INIT_EVERYTHING ) == -1)
        cout &lt;&lt; &quot;Fehler in der SDL-Initialisierung&quot; &lt;&lt; endl;

    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); // Zeiger wird initialisiert
    SDL_WM_SetCaption( &quot;Artes marciales&quot;, NULL );

    time1 = SDL_GetTicks(); // speichert die Zeit in Milisekunden
    cout &lt;&lt; time1 &lt;&lt; endl;

Grafik Zeichnung; // Instanz der Klasse Grafik  , am besten hier schon den screen übergeben und für alle Memberfunktionen zugänglich machen
Spieler Spieler1; // Instanz für den Spieler1
p_Spieler1 = &amp;Spieler1;

    while (game==true)
    {
        while (SDL_PollEvent(&amp;event))
        {
        cout &lt;&lt; &quot;Zähler1:&quot; &lt;&lt; contador1 &lt;&lt; endl;

        //Zeichnung.update(screen); // 1x pro Schleifendurchlauf wird gezeichnet! screen-Zeiger muss übergeben werden...
        SDL_Flip(screen);

        // consultamos el estado del teclado
        keys=SDL_GetKeyState(NULL);
        //if (keys[SDLK_UP]) {dest1.x +=20;}
        if (keys[SDLK_DOWN]) {game=false;}
        if (keys[SDLK_RIGHT]) {Zeichnung.update(screen,osito_vorne,p_Spieler1); Spieler1.laufen_rechts();} // Zeiger wird übergeben
        cout &lt;&lt; &quot;Schleife&quot; &lt;&lt;endl;
</code></pre>
<p>grafik.hpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;SDL/SDL.h&quot;
//#include &quot;spieler.hpp&quot;

using namespace std;

class Grafik
{
  private:
  // Membervariablen
  int x_koordinate_spieler1, y_koordinate_spieler1; // sollte ich mir aus der Klasse Spieler holen!
  int x_koordinate_gegner, y_koordinate_gegner;
  SDL_Rect dest3;
  SDL_Rect hintergrund_werte;
  SDL_Rect osito_werte, osito_werte_overwrite;

  public:

  SDL_Surface *screen, *osito_vorne, *hintergrund;
  Spieler *p_Spieler1;

 /* SDL_Surface *osito_vorne = NULL;
  osito_vorne = SDL_LoadBMP(&quot;osito_vorne.bmp&quot;);
  SDL_Rect dest1, dest1_overwrite;
  dest1_overwrite=dest1;  // löscht die vorherige Position der Animation
  SDL_SetColorKey(osito_vorne, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(osito_vorne-&gt;format,255,0,255));
    //              für welches Bild,                                      Format für das Bild, R,G,B der transparenten Farbe

  // Definimos donde dibujaremos el gráfico
        // y lo copiamos a la pantalla.
        dest1.x = 100;
        dest1.y = 100;
        dest1.w = osito_vorne-&gt;w;
        dest1.h = osito_vorne-&gt;h;
*/
  //Memberfunktionen
  void update(SDL_Surface *screen, SDL_Surface *osito_vorne, Spieler *p_Spieler1);
  void draw_hintergrund (SDL_Surface *screen, SDL_Surface *osito_vorne);
  void draw_spieler1 (SDL_Surface *screen, SDL_Surface *osito_vorne, Spieler *p_Spieler1);
  //void draw_gegner ();

};
</code></pre>
<p>spieler.hpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Spieler
{

  private:
  //Membervariablen
  int x_koordinate_spieler1; // können hier nicht initalisiert werden?
  int y_koordinate_spieler1;

  public:
  //Memberfunktionen
       Spieler(); //Konstruktor, initialisiert die Werte... Achtung!: Muss genau wie die Klasse heißen und ohne void!
  void laufen_rechts();

};
</code></pre>
<p>Danke für alle Tipps! <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/252422/instanz-einer-klasse-an-funktion-anderer-klasse-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 11:27:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252422.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Oct 2009 15:40:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instanz einer Klasse an Funktion anderer Klasse übergeben on Mon, 19 Oct 2009 15:40:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche mich gerade an einem kleinen Spiel mit der SDL und C++.<br />
Ist das 1., das ich schreibe und benutzte das ganze damit auch zum Lernen...</p>
<p>Hab jetzt aber eine Frage und zwar:</p>
<p>Ich habe bisher 2 Klassen geschrieben, 1 für die Grafik und 1 namens &quot;Spieler&quot;, in der bisher die Koordinaten des Spielers stehen.<br />
Im Hauptcode erstelle ich nun eine Instanz von beidem und möchte nun eine Funktion der Grafikklasse aufrufen und dieser als Parameter den &quot;Spieler1&quot; geben (die Instanz der Spielerklasse).<br />
Dafür hab' ich einen Pointer vom Typ &quot;Spieler&quot;, der auf die Instanz &quot;Spieler1&quot; zeigt.<br />
Den übergeb' ich. Jetzt wollte ich in der Grafikklasse diesen Pointer deklarieren/anmelden, bekomm' da aber immer eine Fehlermeldung &quot;ISO C++ forbids declaration of &quot;Spieler&quot; with no type.<br />
Was ist da wohl das Problem?</p>
<p>Ich habe die &quot;spieler.hpp&quot; der Spielerklasse nur in der main-Datei inkludiert, wenn ich die auch noch in der Grafikklasse in den Header stecke, bekomme ich den Fehler, dass die Klasse 2x definiert wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Weiß jemand weiter?</p>
<p>Hier bisschen Code:</p>
<p>main:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;SDL/SDL.h&quot;
#include &quot;grafik.hpp&quot;
#include &quot;spieler.hpp&quot;

//zum Code testen: www.codepad.org

using namespace std;

//The attributes of the screen
const int SCREEN_WIDTH = 1200;  // Hier wird die Größe des Ausgabebildschirms festgelegt....
const int SCREEN_HEIGHT = 800;
const int SCREEN_BPP = 32;  //SCREEN_BPP is the bits per-pixel. In all of the tutorials, 32-bit color will be used.

float time1, time2, time_gesamt;
int test;
int contador1=0;
bool game=true;

SDL_Surface *screen, *osito_vorne = NULL; // Pointer auf Null setzen
SDL_Rect dest2;
SDL_Event event;
Uint8 *keys;
Spieler *p_Spieler1 = NULL;

 int main( int argc, char* args[] ) // SDL brauch diese Parameter
{
    cout &lt;&lt; &quot;hallo&quot; &lt;&lt; endl; // Wie schreib ich in die Konsole? -&gt; SDL leitet das ganze in eine Textdatei um, die sich im bin-Ordner befindet

    // INITIALISIERUNG VON SDL
    if (SDL_Init ( SDL_INIT_EVERYTHING ) == -1)
        cout &lt;&lt; &quot;Fehler in der SDL-Initialisierung&quot; &lt;&lt; endl;

    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); // Zeiger wird initialisiert
    SDL_WM_SetCaption( &quot;Artes marciales&quot;, NULL );

    time1 = SDL_GetTicks(); // speichert die Zeit in Milisekunden
    cout &lt;&lt; time1 &lt;&lt; endl;

Grafik Zeichnung; // Instanz der Klasse Grafik  , am besten hier schon den screen übergeben und für alle Memberfunktionen zugänglich machen
Spieler Spieler1; // Instanz für den Spieler1
p_Spieler1 = &amp;Spieler1;

    while (game==true)
    {
        while (SDL_PollEvent(&amp;event))
        {
        cout &lt;&lt; &quot;Zähler1:&quot; &lt;&lt; contador1 &lt;&lt; endl;

        //Zeichnung.update(screen); // 1x pro Schleifendurchlauf wird gezeichnet! screen-Zeiger muss übergeben werden...
        SDL_Flip(screen);

        // consultamos el estado del teclado
        keys=SDL_GetKeyState(NULL);
        //if (keys[SDLK_UP]) {dest1.x +=20;}
        if (keys[SDLK_DOWN]) {game=false;}
        if (keys[SDLK_RIGHT]) {Zeichnung.update(screen,osito_vorne,p_Spieler1); Spieler1.laufen_rechts();} // Zeiger wird übergeben
        cout &lt;&lt; &quot;Schleife&quot; &lt;&lt;endl;
</code></pre>
<p>grafik.hpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;SDL/SDL.h&quot;
//#include &quot;spieler.hpp&quot;

using namespace std;

class Grafik
{
  private:
  // Membervariablen
  int x_koordinate_spieler1, y_koordinate_spieler1; // sollte ich mir aus der Klasse Spieler holen!
  int x_koordinate_gegner, y_koordinate_gegner;
  SDL_Rect dest3;
  SDL_Rect hintergrund_werte;
  SDL_Rect osito_werte, osito_werte_overwrite;

  public:

  SDL_Surface *screen, *osito_vorne, *hintergrund;
  Spieler *p_Spieler1;

 /* SDL_Surface *osito_vorne = NULL;
  osito_vorne = SDL_LoadBMP(&quot;osito_vorne.bmp&quot;);
  SDL_Rect dest1, dest1_overwrite;
  dest1_overwrite=dest1;  // löscht die vorherige Position der Animation
  SDL_SetColorKey(osito_vorne, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(osito_vorne-&gt;format,255,0,255));
    //              für welches Bild,                                      Format für das Bild, R,G,B der transparenten Farbe

  // Definimos donde dibujaremos el gráfico
        // y lo copiamos a la pantalla.
        dest1.x = 100;
        dest1.y = 100;
        dest1.w = osito_vorne-&gt;w;
        dest1.h = osito_vorne-&gt;h;
*/
  //Memberfunktionen
  void update(SDL_Surface *screen, SDL_Surface *osito_vorne, Spieler *p_Spieler1);
  void draw_hintergrund (SDL_Surface *screen, SDL_Surface *osito_vorne);
  void draw_spieler1 (SDL_Surface *screen, SDL_Surface *osito_vorne, Spieler *p_Spieler1);
  //void draw_gegner ();

};
</code></pre>
<p>spieler.hpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Spieler
{

  private:
  //Membervariablen
  int x_koordinate_spieler1; // können hier nicht initalisiert werden?
  int y_koordinate_spieler1;

  public:
  //Memberfunktionen
       Spieler(); //Konstruktor, initialisiert die Werte... Achtung!: Muss genau wie die Klasse heißen und ohne void!
  void laufen_rechts();

};
</code></pre>
<p>Danke für alle Tipps! <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/1794917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794917</guid><dc:creator><![CDATA[Barcelona]]></dc:creator><pubDate>Mon, 19 Oct 2009 15:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz einer Klasse an Funktion anderer Klasse übergeben on Mon, 19 Oct 2009 15:48:13 GMT]]></title><description><![CDATA[<p>Du musst deine Header mit Includeguards versehen, dann vermeidest du das Problem mit den doppelten Definitionen.<br />
Desweiteren kannst du immer eine forward declaration machen, also schon mal mit class Spieler; anmelden, dass es die Klasse überhaupt gibt. Dann ist der Compiler auch zufrieden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794924</guid><dc:creator><![CDATA[Nanyuki]]></dc:creator><pubDate>Mon, 19 Oct 2009 15:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz einer Klasse an Funktion anderer Klasse übergeben on Mon, 19 Oct 2009 16:10:44 GMT]]></title><description><![CDATA[<p>Nanyuki schrieb:</p>
<blockquote>
<p>Du musst deine Header mit Includeguards versehen, dann vermeidest du das Problem mit den doppelten Definitionen.<br />
Desweiteren kannst du immer eine forward declaration machen, also schon mal mit class Spieler; anmelden, dass es die Klasse überhaupt gibt. Dann ist der Compiler auch zufrieden.</p>
</blockquote>
<p>Danke! Der Includeguard war die Lösung <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="😉"
    /> Kannte ich bisher noch nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1794936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1794936</guid><dc:creator><![CDATA[Barcelona]]></dc:creator><pubDate>Mon, 19 Oct 2009 16:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz einer Klasse an Funktion anderer Klasse übergeben on Tue, 20 Oct 2009 09:49:21 GMT]]></title><description><![CDATA[<p>Und bitte kein &quot;using namespace std;&quot; in Header-Dateien!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795211</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 20 Oct 2009 09:49:21 GMT</pubDate></item></channel></rss>