2 Funktionen mit derselben Variable aber doch nicht...



  • Hiho,

    Ich habe hier 2 Funktionen die eigentlich auf dieselbe Variable zugreifen sollten, es aber nicht tun, warum?

    Wenn ich von CPlayer::Legen auf CBomb::BombeLegen aufrufe, und dann von CGame::Render auf CBomb::Render dann ist "bomb" leer, warum? sollte es nicht dieselbe Variable sein? oder ist sie anders weil ich von CGame::Render komme und das halt nichts mit CPlayer::Legen zutun hat? Wenn ja, wie könnt ich diese Problem schön lösen?

    Danke für eure Hilfe!

    void CBomb::BombeLegen()
    {
    
    	bomb->push_back(bomben);
    
    }
    
    void CBomb::Render(sf::RenderWindow *spielWindow)
    {
    
    	if (!bomb->empty())
    	{
    		spielWindow->draw(s_bomb);
    	}
    
    }
    
    void CPlayer::Legen()
    {
    
    	if (sf::Keyboard::isKeyPressed(sf::Keyboard::T))
    	{
    		bombe->BombeLegen();
    	}
    
    }
    
    void CGame::Render()
    {
    
    		bombfield->Draw(&spielWindow);
    		bombe->Render(&spielWindow);  // <--- hier
    		player->Render(&spielWindow);
    		spielWindow.display();
    		spielWindow.clear(sf::Color::Black);
    
    }
    
    #pragma once
    
    #include "Spiel.hpp"
    #include "Spieler.hpp"
    
    #include <list>
    
    using namespace std;
    
    class CBomb
    {
    
    public:
    	CBomb();
    	~CBomb();
    	void Render(sf::RenderWindow *spielWindow);
    	void Update();
    	void BombeLegen();
    	void Timer();
    
    	struct SBomben
    	{
    		int koordX;
    		int koordY;
    		string typ;
    	};
    
    private:
    
    	sf::Texture t_bomb;
    	sf::Sprite s_bomb;
    
    	int bombsizeX, bombsizeY;
    
    	SBomben bomben;
    
    	list<SBomben> *bomb;
    
    };
    


  • list<SBomben> *bomb;

    Du hast in deiner Klasse einen Pointer auf eine Liste vom Typ SBomben erstellt aber den Pointer auf keine Liste vom Typ SBomben im Heap zeigen lassen.

    Entweder du weißt dem Pointer mit new einen Speicherbereich zu oder du erstellt eine dir eine Liste vom Typ SBomben aufm Stack.



  • achso jo ich seh schon ich hab n teil nich gepostet...

    CBomb::CBomb()
    {
        ...
    	bomb = new list<SBomben>;
    
    }
    


  • Warum heißt die Liste "bomb", das Einzelobjekt "bomben" und das was Du in CPlayer::Legen und CGame::Render verwendest "bombe"?



  • bomben ist das Objekt für die Struktur der Bomben.

    bomb ist die liste.

    bombe ist das Objekt für die Klasse der Bomben.

    vieleicht nicht die beste namenswahl :p



  • Und wozu hat eine Bombe eine Liste mit Bomben?



  • Na dann ist die Lösung doch einfach: Der Zeiger bombe in der CPlayer-Instanz zeigt auf ein anderes Objekt als der Zeiger bombe in der CGame-Instanz.



  • Hmm und wie mach ich nun das es derselbe zeiger is? irgendwie raff ich das nicht...

    Und wozu hat eine Bombe eine Liste mit Bomben?

    hmm? die liste is ein eigenes Objekt...



  • Flutscherino schrieb:

    hmm? die liste is ein eigenes Objekt...

    Die Liste ist ein nicht statischer Member der Klasse CBomb. Also bekommt jede Instanz dieser Klasse eine solche Liste. Also hat jede deiner Bomben eine Liste mit Bomben. Wozu? Scheint mir nicht so sinnvoll.



  • Eigentlich wollte ich eine Liste für Bomben, nicht das jede Bombe eine liste mit bomben hat, sondern das ganze Programm hat eine liste mit bomben..



  • Das wäre auch sinnvoll, im Gegensatz zu der jetzigen Situation. Warum machst du es nicht so? Findest du keinen Platz? 😃



  • Naja ich bin bisschen am probieren, grad im moment muss ich auf die liste überhaupt zugreifen können bevor ich sie irgendwo fest hinblätter, ein problem nach dem anderen 😉

    irgendwie hab ichs eben immernoch nich raus wie ich die Variable so deklarier das es geht, ohne das ich da gross was an parameter übergeben muss... ich weis schon das ich sie einfach im spiel selber deklariren könnte und parameter schieben, aber genau das will ich nicht, von daher muss ne bessere lösung her 😉

    hättest du ne idee? irgend n tipp? 😕



  • LordJaxom schrieb:

    Na dann ist die Lösung doch einfach: Der Zeiger bombe in der CPlayer-Instanz zeigt auf ein anderes Objekt als der Zeiger bombe in der CGame-Instanz.

    Ich krieg das einfach nicht hin, wie mach ich das beider der Zeiger auf das selbe Objekt zeigen aber von verschiedenen Quellen kommen?



  • Ok, noch ein weiterer versuch, ich hab bis dato alles schön umgeschrieben sodas ich keine Parameter in den Funktionen mehr habe.. aber eben, wie schon vorher geschrieben, dasselbe problem nochmals....
    Irgendwie krieg ich es codlich einfach nicht hin das er den Pointer ausliest den ich gerne hätte... oh mein gott wie mach ich das bloss?

    void CGame::Init()
    {
    
    	gWindow.create(sf::VideoMode(400, 400, 32), "Boom");
    
    	bombmap.Init();
    
    	Run();
    
    }
    
    void CGame::Run()
    {
    
    		bombmap.Draw();
    
    }
    
    void CBombMap::Init()
    {
    
    	game = new CGame;
    
    }
    
    void CBombMap::Draw()
    {
    
    	bWindow = game->getWindow();
    
    // Dashier will einfach nicht dasselbe Window wiedergeben wie ich schon offenhabe... und ich weis einfach nicht wie ich das codlich darstelle damit es klappt :/
    
    }
    
    sf::RenderWindow *CGame::getWindow()
    {
    	return &gWindow;
    }
    
    #pragma once
    #include <SFML\Graphics.hpp>
    #include <SFML\System.hpp>
    
    #include "BombMap.hpp"
    
    class CGame
    {
    
    public:
    	CGame();
    	~CGame();
    	void Init();
    	sf::RenderWindow *getWindow();
    
    private:
    	void Run();
    
    	CBombMap bombmap;
    
    	sf::RenderWindow gWindow;
    
    };
    
    #pragma once
    #include <SFML\Graphics.hpp>
    #include <SFML\System.hpp>
    
    class CGame;
    
    class CBombMap
    {
    
    public:
    	CBombMap();
    	void Init();
    	void Draw();
    	void Load();
    
    private:
    
    	char map[100][100];
    
    	sf::RenderWindow *bWindow;
    
    	CGame *game;
    
    	sf::Sprite SWall, SGround;
    	sf::Texture TWall, TGround;
    
    };
    


  • Über 400 views aber keiner will mir helfen? Ich steck irgendwir seit tagen an dem selben problem und ka wo der wurm drin ist... Kann sich keiner kurz zeit nehnen für mein problemchen? 😞


  • Mod

    Flutscherino schrieb:

    Über 400 views aber keiner will mir helfen? Ich steck irgendwir seit tagen an dem selben problem und ka wo der wurm drin ist... Kann sich keiner kurz zeit nehnen für mein problemchen? 😞

    Na, etwas mehr Geduld am Samstagabend. 🙂

    Ein Problem dürfte hier sein, dass deine letzte Frage ziemlich unklar ist. Du sagst, du bekommst es nicht so hin, wie du es haben willst. Na toll! 🙄 Wenn man dir nun helfen wollte, dann müsste man den ganzen Thread aufmerksam durchforsten, wo wohl steht, was du willst, wenn du es überhaupt schon einmal beschrieben hast. Im ersten Beitrag steht es jedenfalls nicht. So hat der Leser schon zwei ziemlich lange Beiträge gelesen (den ersten und den letzten) und hat immer noch keinen Plan, was gefragt ist. Da werden die meisten Leser, die nicht sowieso schon den ganzen Thread verfolgt haben, einfach abbrechen.

    Daher etwas leserfreundlicher posten wenn man schnell Antworten haben möchte. Präzise Fragestellungen auf den Punkt gebracht, nicht lange schwafeln, Beiträge nicht mit unnötigem Code zumüllen (aber auch nicht zu wenig Code! Siehe dritten Link in meiner Signatur für Tipps). Und auf keinen Fall mitten im Thread das Thema wechseln!



  • Warum zur Hölle speicherst du einen Zeiger auf dein Game in der BombMap? Das ist doch ein schwerer Design-Fehler. Mach dir eine Klasse Game , welcher du ein Element oder besser einen unique_ptr vom Typ BombMap spendierst. BombMap hält ein Feld(kannst dir ja einen Wrapper um ein zweidimensionales Feld machen) aus Bomben. So in etwa:

    class Bomb
    {
        unsigned damage;
    
        public:
    
            explicit Bomb(unsigned d) : damage(d) {}
    };
    
    class BombMap
    {
        typedef vector<vector<unique_ptr<Bomb> > > Tda;
        Tda bombs;
    
        public:
    
            explicit BombMap(Tda const&); //was auch immer du da machen willst
    };
    
    class Game
    {
        unique_ptr<BombMap> map;
    
        public:
    
            explicit Game();
    
            void RenderGame()//Spiel rendern, entweder holst du dir die
                             //map als ganzes oder renderst jedes feld einzeln
                             //hab selbst noch nie mit sfml gearbeitet
    };
    

    Am allerbesten ist es natürlich, wenn du die Fensterhandles/-zeiger getrennt vom Spiel verwaltest und das in irgendeiner Art verbindest. Auf jeden Fall ist dein Design komplett falsch, wenn deine BombMap einen Zeiger auf sowohl das gesamte Spiel, als auch auf das Fenster hält. Der Sinn der OOP ist, dass jede Klasse ihre individuelle Aufgabe erfüllt und alle Aufgaben, die nicht die ihren sind weiter delegiert. Mein Code soll nur eine Art Pseudocode sein, bevor sich hier alles streitet, ob man einen unique_ptr in einem vector speichern soll^^



  • Vielen dank für die antworten, ich dachte eigentlich das meine frage klar ist lol.. Was ich haben wollte ist ein zeiger in der CPlayer klasse die auf das Window in der CGame klasse zeigt zum zeichnen des spielers.. Ich weis shon das ich es auch anders lösen kann, aber mir ging es halt darum es genau so hinzubringen 😉



  • Flutscherino schrieb:

    class CGame
    {
    public:
    //...
    private:
      CBombMap bombmap;
    //...
    };
    
    class CBombMap
    {
    public:
    //...
    private:
      CGame *game;
    //...
    };
    
    void CGame::Init()
    {
      gWindow.create(sf::VideoMode(400, 400, 32), "Boom");
      bombmap.Init();
      Run();
    }
    
    void CBombMap::Init(){
      game = new CGame;
    }
    

    Also: ich sehe das richtig und das ist auch so gewollt:

    • CGame hat ein bombmap member, das wiederum einen Zeiger auf CGame hat.
    • CGame::Init ruft Bombmap::init auf, dass diesen Zeiger auf ein neu erstelltes CGame Objekt umbiegt.

    Das scheint suspekt. Ausserdem riecht es nach Speicherleck und wie die C'tors aussehen würde mich noch interessieren.



  • Naja, ja.. Ich will halt bloss in der CPlayer klasse das fenster abrufen können wo ich in der CGame klasse erstelle.. Nicht mehr ujd nicht weniger 😉


Anmelden zum Antworten