Programm kann anscheinen nicht auf member-variable zugreifen
-
Hallo,
ich programmiere zur Zeit ein Spiel, und jetzt hab ich das Problem, dass das Spiel immer abstürzt, wenn ich versuche, von einer Memberfunktion auf eine Membervariable der gleichen Klasse zuzugreifen.
Die Funktion und die Deklarierung der Variable befinden sich in unterschiedlichen Dateien (player.cpp und player.hpp).
Und die Variable ist privat und die Funktion public.Zum Quelltext: Ich will ein Klasse CPlayer schreiben, die alle Aktionen des Spielers verwaltet. Dazu gibt es eine Init-Funktion, die alles Initialisiert: die Aufstellung der Spielsteine, die Menge an Spielsteinen und, was auch das Problem ist, die Art der Speilsteine (schwarz oder weiß).
void Init:
// project: backgammon // file: Player.cpp // author: BOSS2000 // #include <iostream> #include "Player.hpp" void CPlayer::Init(SDL_Renderer* renderer, S_place* place[], int StoneKind) { // initialize game stones int actualNumber = 0; this->stoneKind = StoneKind; // hier stürzt das Programm ab for (int i = 0; i < 15; i++) { if (place[i]->numberOfStones > 0 && place[i]->stoneKind == stoneKind) { for (int j = 0; j < place[i]->numberOfStones; j++) { gameStone[actualNumber]->Init(renderer, stoneKind, place[j]->xPos, place[j]->yPos); } } } }
Player.hpp:
// project: backgammon // file: Player.hpp // author: BOSS2000 // #include <SDL2\SDL.h> #include "Texture.hpp" #include "GameStone.hpp" #include "structures.hpp" #pragma once class CPlayer { public: // member functions void Init(SDL_Renderer* renderer, S_place* place[], int StoneKind); // initialize player and gamestones // member variables private: // member functions void rollTheDice(); // roll the dice void selectGamestone(); // check, wich stone the player is clicking on void moveStone(); // move the selected stone // member variables CGamestone* gameStone[15]; // instances of gamestones int DiceNumber_1; // the number, wich the first dice shows after throwing int DiceNumber_2; // the number, wich the second dice shows after throwing int stoneKind; // if 0: black, if 1: white };
Ich habe mich bereits im Internet informiert, und konnte niemanden finden der ein ähnlich Problem hat.
Ich gehe davon aus, dass es irgendein kleiner Fehler ist (eine vergessene Klammer oder so) aber ich kann einfach nichts finden.Ich danke allen, die sich die Mühe machen, meinen Code durchzulesen und hoffe, dass jemand die Lösung findet
Mfg
BOSS2000
-
Ich tippe auf zerstörtes CPlayer Objekt - was nichts daran hindert deinen Init Routine aufzurufen
schau mal wann der Ctor, Dtor von CPlayer aufgerufen wird - ist das alles so wie es sein soll?
-
oder du über/unterschreibst irgendwo Speicher und machst damit dein Objekt kaputt
-
Danke für deine schnelle Antwort!
Und wie soll es sein?
Angenommen es ist zerstört wie kann ich es reparieren?
-
Aha! Ich hab den Fehler
Ich hab vergessen dem CPlayer-Objekt einen Speicher zu reservieren XDWie gesagt, ein kleiner Leichtsinnsfehler!
Danke Gast3!
-
Eine public Init-Mathode - wofür gibt es wohl Konstruktoren?
-
Und wie soll es sein?
Angenommen es ist zerstört wie kann ich es reparieren?Es nicht zerstören
aber jetzt ist ja alles ok
-
Ich benutze lieber Init-Methoden, damit ich den Konstruktor schon am Anfang des Programms aufrufen kann, und die Objekte dann später, z.B. wenn ich die Position des Objektes kenne, initialisieren kann.
Ich hab mir das so angewöhnt, da ich es auch einfach übersichtlicher finde.
-
Gewöhn dir das ab und instanziiere deine Klassen da, wo du sie brauchst. Das wird dir sonst später Probleme bereiten.
Brauchst du das Objekt nicht, lege es auch nicht an.