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 XD

    Wie 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.


Anmelden zum Antworten