Pointerzugriff von einer anderen Klasse aus
-
Hallo Leute,
ich habe da ein Problem und hoffe das mir jemand irgendwie einen Tip geben kann.
Die Sache ist die: Ich habe eine Klasse Framework in der ein Pointer auf die Funktion SDL_Renderer zeigt die während dem ausführen von CFramework::Init() initialisiert wird.// Create renderer for the window m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, SDL_RENDERER_ACCELERATED); if(m_pRenderer == NULL) { printf("Renderer could not be initialized! SDL Error: %s\n", SDL_GetError()); Quit(); return (false); }Ich will von einer anderen Klasse (CTexture) aus, auf diesen Pointer (oder die Speicheradresse) zugreifen um der zu rendernen Textur den im Framework initialisierten SDL_Renderer zuzuweisen, aber es funktioniert nicht.
// Render // // Task: Render Sprite (without Animation) // void CTexture::Render () { SDL_RenderCopy (m_pRenderer, m_pTexture, NULL, NULL); } // RenderDie Framework.hpp ist natürlich in der Texture.hpp includiert.
Ich hab folgendes versucht um das Problem zu lösen:
1. SDL_Renderer *m_pRenderer von einer private zu einen public Membervariable gemacht.
2. Versucht den Pointer in der Headerdatei von CTexture zu deklarieren was aber logischerweise darin mündete, das der Pointer in den Klassen CFramework und in CTexture 2 unterschiedliche Speicheradressen hatte, also von vornhinein eine Schnapsidee war
3. CTexture eine friend class von CFramework gemacht (friend class CTexture;)
4. CFramework einen Singleton gemacht
5. langes, endloses nicht mehr genau nachvollziehbares herumprobieren, im Internet nach Lösungen suchen usw.Das Ende vom Lied ist, ich bin im Moment komplett planlos wie ich das lösen soll. Ich will m_pRenderer keinen globalen Pointer machen, auch wenn dass das Problem lösen könnte, aber es muss auch ohne Globals möglich sein auf den Pointer einer anderen Klasse zuzugreifen.
Mfg Lestat
-
Dein CTexture-Objekt muss irgendwie das CFramework-Objekt kennen. Wie genau, kommt drauf an, wie die beiden Klassen und Instanzen davon sich zueinander verhalten. Alleine aus den Namen kann ich nicht fuer dich folgern, welche Bedeutung du diesen Klassen zuschreibst, das musst du selber wissen.
Zwei Bemerkungen:
1. Dir scheint der Unterschied zwischen einer Klasse und der Instanz einer Klasse (einem Objekt) nicht klar zu sein. Dies ist ein ungeheuer wichtiger Unterschied. Du solltest vielleicht nochmal die Grundlagen der objektorientierten Denkweise studieren.
2. Deine Loesungsversuche deuten darauf hin, dass du wild herum raetst, ohne zu verstehen was du tust. Das ist keine erfolgsversprechende Strategie. Erstens ist es unwahrscheinlich, dass man so eine funktionierende Loesung erhaelt. Zweitens ist es noch viel unwahrscheinlicher, dass eine funktionierende Loesung dann auch richtig ist. Jede Menge Unsinnscode funktioniert an sich, da er technisch richtig ist; bloss das Ergebnis ist dann Muell.Dein Problem ist uebrigens nicht spezifisch fuer Pointermember, sondern hier geht es allgemein um das Zusammenspiel von Klassen und Objekten dieser Klassen. Siehe meinen Punkt 1.
-
Parameter sind keine Schande:
void CTexture::Render (SDL_Renderer* renderer) { SDL_RenderCopy (renderer, m_pTexture, NULL, NULL); }Falls du der Menschheit einen gefallen tun möchtest, vermeide:
- Präfix "C" vor Klassennamen. Das verringert die Lesbarkeit und hat noch nie jemandem geholfen.
- Seltsam platzierte Leerzeichen (Render ()). Das irritiert sehr, wenn man es nicht gewohnt ist (und das sind die wenigsten Leser).
- Ungarische Notation (m_pTexture). Das ist einfach nur Schwachsinn. Falls du das in einem Buch gelesen hast, verbrenne es.printf, weil zu fehleranfällig. Das kann man in C++ besser machen.
- globale Variablen, auch manchmal "Singleton" genannt. Die sind gefährlich ohne einen besonderen Nutzen zu haben.
-
Danke für die schnelle Antwort,
ok, jetzt wird der Grund klar.
CFramework dient im Momemt ausschliesslich Belangen die mit der Ausgabe auf dem Bildschirm zu tun haben.
Das einzige Objekt das es bis jetzt gibt wird in der Klasse CGame erzeugt und die kennt die Rendererfunktion SDL_Renderer m_pRenderer nicht, daher konnte ich diese bisher nicht übergeben.Ich wollte Game und Framework strickt trennen weil sie eigentlich zwei total unterschiedliche Sachen machen, aber jetzt werd ich sie zusammenlegen da ich in der Gameklasse den Pointer brauche um ihn der Renderfunktion der erzeugten Objekte dort zu übergeben.
-
LestatDeLioncourt schrieb:
Ich wollte Game und Framework strickt trennen weil sie eigentlich zwei total unterschiedliche Sachen machen,
Gut und richtig.
aber jetzt werd ich sie zusammenlegen da ich in der Gameklasse den Pointer brauche um ihn der Renderfunktion der erzeugten Objekte dort zu übergeben.
Jetzt machst du alles kaputt. Warum muss die Gameklasse ueberhaupt die Renderfunktion anfassen? Das ist doch Sache des Frameworks! Mir scheint, das Problem ist eher, dass Game und Framework noch nicht richtig getrennt waren. Die Loesung ist sicher nicht, sie beide zusammen zu fassen.
-
"Framework" ist kein sinnvoller Name für die Klasse. Die müsste bei dir eher "Renderer" oder so heißen.
Du könntest denSDL_Rendererauch dem Konstruktor vonTexturegeben.Rendererkonstruiert dann dieTexture-Objekte undGamemuss nichts vonSDL_Renderermehr wissen.
-
@TyRoXx Die Renderfunktion in die Texture Klasse packen ist wahrscheinlich am sinnvollsten. Ich muss das ganze noch in eine If Abfrage packen, damit der Renderer wirklich nur einmal konstruiert wird. Die Textureklasse wird von jeder auf dem Screen sichtbaren Instanz einmalig aufgerufen um die Texture bei der Initialisierung zu laden, die Zeiger zuzuweisen und usw...und ja, der Name Framework ist etwas unglücklich gewählt

@SeppJ Die Trennung werd ich beibehalten und den Renderer aus der Frameworkklaasse in die Textueklasse packen, der wurd ohnehin in der Frameworkclass nur initialisiert
Danke an euch für euer Feedback