Anfängerfrage: Objekt im Konstruktor erstellen...



  • ..Hallo,
    ich versuche ein Objekt im Konstruktor einer Klasse zu erstellen, um in späteren Methoden dieser Klasse darauf zugreifen zu können.
    Leider bin ich zu dumm 😃
    **
    Einmal der header:**

    #ifndef _MENUSTATE_HPP
    #define _MENUSTATE_HPP
    
    #include "controller.h"
    
    class MenuState : public ProgramStates
    {
    public:
    	MenuState();
    	~MenuState();
    	void HandleEvents(controller& controller);
    	void Update(controller& controller);
    	void Draw(controller& controller);
    private:
    
    	// ???
    	Player Player;
    
    };
    #endif
    

    ..Und die .cpp Datei

    #include "menustate.h"
    
    MenuState::MenuState()
    {
    	// Versuch das Objekt "Player" im Konstruktor zu erstellen und es in den restlichen Methoden verfügbar zu machen
    	Player Player();
    }
    
    void MenuState::HandleEvents(controller& controller)
    {
    
    }
    
    void MenuState::Update(controller& controller)
    {
    	// Hier z.B :D
    	Player.Update();
    }
    
    void MenuState::Draw(controller& controller)
    {
    
    }
    
    MenuState::~MenuState()
    {
    
    }
    

    Danke schonmal 🙂



  • El-nekr0 schrieb:

    MenuState::MenuState()
    {
    	// Versuch das Objekt "Player" im Konstruktor zu erstellen und es in den restlichen Methoden verfügbar zu machen
    	Player Player();
    }
    
    MenuState::MenuState()
        : Player(hier, duerfen, auch, Argumente, stehen)
    {
    }
    

    Und falls du keine Argumente brauchst kannst du die ": Player( ..." Zeile auch ganz weglassen.



  • Die Zeile Player player(); (ich hab hier mal die Groß/Kleinschreibung geändert um Beide unterscheiden zu können) macht etwas völlig anderes als du dir vielleicht denkst. Sie deklariert eine Funktion mit dem Namen player , hat keine Parameter und gibt ein Objekt vom Typ Player zurück! Die eigentlich richtige Syntax um ein Objekt ohne Parameter zu erstellen ist Player player; . Wenn du das in deinen Konstruktor schreibst erstellst du aber einfach ein lokales Objekt welches nichts mit deiner Membervariable zu tun hat. Eigentlich musst du in deinen Konstruktor gar nichts schreiben um Membervariablen zu erstellen. Die einzige Ausnahme ist wenn die Membervariablen keinen Konstruktor ohne Parameter hat. Dann muss man diese Parameter mit der von hustbaer gezeigen Syntax übergeben.

    Noch eine Anmerkung zum Code: Es ist schlechter Stil für Klassen und Objekte die exakt gleichen Namen zu verwenden. In einfachen Beispielen mag es zwar funktionieren aber wenn man mehrere Objekte erstellen will kriegt man schon Probleme. Meine Konvention ist z.B. Klassennamen mit einem Großbuchtaben zu beginnen und Variablennamen mit einem Kleinbuchstaben.



  • Erstmal vielen dank für die schnellen Antworten 🙂
    wenn ich das Objekt so erstelle, funktioniert es natürlich wunderbar:

    #include "menustate.h"
    
    MenuState::MenuState()
    {
    
    }
    
    void MenuState::HandleEvents(controller& controller)
    {
    
    }
    
    void MenuState::Update(controller& controller)
    {
    	Player player;
    	player.Update();
    }
    
    void MenuState::Draw(controller& controller)
    {
    
    }
    
    MenuState::~MenuState()
    {
    
    }
    

    So wird das Objekt allerdings in meinem späteren Code jedes mal neu erstellt..Ich möchte es gerne einmal erstellen und in den anderen Methoden, z.B. Update, benutzen...
    Wie stelle ich das an? 😃
    Ích verstehe nicht so recht warum dies mit meiner eigenen Klasse "Player" nicht funktioniert, mit Klassen aus der SFML Bibliothek jedoch ohne Probleme:

    #ifndef GAME_HIGHSCORE_HPP
    #define GAME_HIGHSCORE_HPP
    
    #include "SFML\Graphics.hpp"
    #include "programstates.h"
    #include "menustate.h"
    #include "player.h"
    
    #include <memory>
    
    using namespace sf;
    
    class controller
    {
    	public:
    
    		controller();
    
    		enum class States{ MAINMENU, };
    
    		void Run();
    		bool IsRunning();
    		void ChangeState(States newstate);
    		bool running = true;
    		RenderWindow window;
    
    	private:
    
    		std::unique_ptr<ProgramStates> CurrentState;
    
    };
    
    #endif
    

    ...Z.b. mit dem "window" Objekt hier im header angegeben..

    #include "controller.h"
    
    controller::controller()
    {
    	window.create(VideoMode(640, 480), "ROFL die Katz");
    	running = true;
    
    }
    
    bool controller::IsRunning()
    {
    	return running;
    }
    
    void controller::Run()
    {
    	while (window.isOpen()){
    		CurrentState->HandleEvents(*this);
    		window.clear(Color(20, 80, 150));
    
    		CurrentState->Update(*this);
    		CurrentState->Draw(*this);
    
    		window.display();
    	}
    }
    

    ..und in der .cpp Datei benutzt..
    Danke auch nochmal für den Tipp von hustbaer (übrigens top name :D), da später Parameter übergeben werden sollen 🙂
    Würde mich über eine Antwort freuen,
    schönes Restwochenende noch!



  • Das

    Player Player;
    

    in deinem ersten geposteten Header sah schon ganz gut aus. Lediglich noch den Variablennamen anders, also z.B. klein geschrieben bennennen:

    Player player;
    

    Und sonst nichts mehr. Das wars. Fertig. Es sei denn du möchtest explizit einen Konstruktor mit Argumenten für die Instanz player der Klasse Player aufrufen.
    Dann siehe zweiten geposteten Code von hustbaer (das "Player" dort muss aber im fall einer Member-Variable der Variablenname und nicht der Klassenname sein, also dann auch dort klein schreiben).

    Finnegan

    P.S.: Und BTW: Ist zwar spassig mit SFML rumzuspielen und mit so etwas wie einem Spiel anzufangen, es kann aber nicht schaden sich erstmal durch die Grundlagen von C++ zu quälen,
    das steigert die Wahrscheinlichkeit, dass auch wirklich was bei rum kommt - zumindest so ein paar Basics wie u.a. "lokale Variable", "Member-Variable" und "Muss-Man-Als-Anfänger-Nicht-Wissen"-Variable
    wären nicht verkehrt zu kennen bevor man sich aus dem Hallo-Welt-Planschbecken wagt 😃


Log in to reply