Array mit eigenem Datentyp erstellen



  • Hi Leute,

    ich habe eine eigene Klasse 'Gegenstand' (natürlich ohne die '') geschrieben und würde jetzt gerne Objekte davon in einem eigenen Array speichern. Mittlerweile habe ich schon so viel ausprobiert, um das hinzukriegen, aber nichts hat funktioniert. Das Problem, das ich bisher immer hatte war nämlich dieses, dass es keinen Syntaxfehler gab, sondern das Programm ganz normal durchlief, aber das erstellte Objekt einfach nicht im Array gespeichert wurde.

    Ich poste jetzt absichtlich keinen Quellcode weil es mir allgemein darum geht, wie ich ein Array eines eigenen Datentyps erstelle (Sollte das abgehakt sein, können wir uns ggf. um das konkrete Problem kümmern). Könnte mir das jemand erläutern?

    Grüße,
    David

    PS: Ja, ich weiß, es gibt auch std::vector<>, aber 1.sind die für meinen Verwendungszweck umständlicher und 2.hat es mit denen bisher genauso wenig geklappt.


  • Mod

    Velociraptor45 schrieb:

    Das Problem, das ich bisher immer hatte war nämlich dieses, dass es keinen Syntaxfehler gab, sondern das Programm ganz normal durchlief, aber das erstellte Objekt einfach nicht im Array gespeichert wurde.

    Und wie hast du das festgestellt?

    Ich poste jetzt absichtlich keinen Quellcode

    Solltest du aber, denn wahrscheinlich ist dein Programm falsch, nicht deine Syntax.

    weil es mir allgemein darum geht, wie ich ein Array eines eigenen Datentyps erstelle (Sollte das abgehakt sein, können wir uns ggf. um das konkrete Problem kümmern). Könnte mir das jemand erläutern?

    Name_des_Datentyps name_des_arrays[Anzahl_der_Elemente];
    




  • Hi,

    das habe ich 1.dadurch festgestellt, dass der sprite nicht gerendert wurde und Visual Studio 2013 Express bietet eine "Überwachen"-Funktion, bei der man Objekte/Arrays/Vectoren etc überwachen kann.

    //Im Header (nur Ausschnitt)
    
    private:
    	Gegenstand leiste[8];
    
    //In der cpp
    
    Gegenstand sword1("images\\Weapons\\Sword.png", "Schwert");
    
    Waffenleiste::Waffenleiste(std::string tex)
    {
    	textur.loadFromFile(tex);
    	sprite.setTexture(textur);
    
    	leiste[0] = sword1;
    }
    

    und wenn ich jetzt die Rendermethode so anspreche:

    void Waffenleiste::Render(sf::RenderWindow &window)
    {
    	leiste[0].Render(window);
    }
    

    wird der Sprite nicht gerendert. Wenn ich aber die Rendermethode so anspreche:

    void Waffenleiste::Render(sf::RenderWindow &window)
    {
    	sword1.Render(window);
    }
    

    wird der Sprite gerendet. Was ist mit dem Array los?



  • Vielleicht geht irgendwas beim Kopieren deiner Klasse schief. Der gezeigte Code ist jedenfalls soweit in Ordnung. Zeig mal aus was deine Gegenstand Klasse besteht.



  • //Header
    
    #ifndef _GEGENSTAND_H
    #define _GEGENSTAND_H
    
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include "Zufall.h"
    
    class Gegenstand
    {
    	public:
    		Gegenstand(std::string tex, std::string n);
    		Gegenstand();
    		void Render(sf::RenderWindow &window);
    		void setPosition(float x, float y);
    		void shout(); //Das is nur ne kleine Testmethode
    		void setTextur(std::string tex);
    
    	protected:
    		std::string name;
    		Zufall RandNumber;
    
    		sf::Texture textur;
    		sf::Sprite sprite;
    };
    
    #endif
    
    //cpp
    
    #include "Gegenstand.h"
    
    Gegenstand::Gegenstand()
    {
    
    }
    
    Gegenstand::Gegenstand(std::string tex, std::string n)
    {
    	textur.loadFromFile(tex);
    	sprite.setTexture(textur);
    
    	name = n;
    }
    
    void Gegenstand::Render(sf::RenderWindow &window)
    {
    	window.draw(sprite);
    }
    
    void Gegenstand::setPosition(float x, float y)
    {
    	sprite.setPosition(x, y);
    }
    
    void Gegenstand::shout()
    {
    	std::cout << "Ich wurde angesprochen, mein Name ist: " << name << std::endl;
    }
    
    void Gegenstand::setTextur(std::string tex)
    {
    	textur.loadFromFile(tex);
    	sprite.setTexture(textur);
    }
    


  • Sieht in Ordnung aus. Benutzt du auch an allen anderen Relevanten stellen das Objekt aus dem Array? Mir fällt da die setPosition in Auge. Nicht, dass dein Objekt irgendwo an Position (0, 0) festhängt und man es deshalb nicht sieht.

    Velociraptor45 schrieb:

    und Visual Studio 2013 Express bietet eine "Überwachen"-Funktion, bei der man Objekte/Arrays/Vectoren etc überwachen kann.

    Und was konntest du dort sehen? Die Objekte im Array haben nicht die erwarteten Werte/Array ist leer oder sowas?



  • OK, doch keine Vererbung.
    Interessant 🙂



  • Hier mal ein Screenshot von der Überwachungsfunktion nachdem das Array an Position 0 gefüllt wurde. Bei Name müsste zb. statt "" "Schwert" stehen.
    http://prntscr.com/88umso

    um die setPosition Methode brauchst du dir keinen Kopf machen, denn wie ich gesagt habe: sobald ich das Objekt nicht aus dem Array anspreche, sondern direkt, wird es gerendert.

    Und es gibt keine anderen Stellen, an denen ich das Array oder das Objekt verwende. Es gibt nur die Zuweisung im Konstruktor

    leiste[0] = sword1;
    

    und dann den Aufruf in Waffenleiste::Render(sf::RenderWindow &window) .

    leiste[0].Render(window);
    


  • Ich seh da grad nicht, wo du im Konstruktor den Namen zuweist. Ergo bleibt der Name leer...

    (Oder ich übersehs grad)



  • [code="cpp"]Gegenstand::Gegenstand(std::string tex, std::string n)
    {
    textur.loadFromFile(tex);
    sprite.setTexture(textur);

    name = n;
    }[/code]

    Aber es is ja nicht nur der Name. Bei Textur und Sprite sind auch alle Werte auf 0.



  • Genau, der Code zum anlegen von sword1 wäre dazu noch interessant.

    int main() {
    	Gegenstand gs[3];
    	Gegenstand g("hallo", "test");
    	gs[0] = g;
    	g.shout();
    	gs[0].shout();
    }
    

    Gibt bei mir 2mal den richtigen Namen aus. D.h. irgendwas machst du außerhalb des für uns sichtbaren Codes falsch.



  • Ok, ich hab jetzt mal n bisschen rumprobiert und anscheinend ist das Problem der Ort, an dem ich sword1 erstelle (siehe Post um 22:22:38 Uhr).

    Allerdings habe ich das Problem jetzt gelöst, indem ich das Gegenstand -Objekt in einer anderen Klasse erstelle und dann über die Methode

    void Waffenleiste::addGegenstand(Gegenstand &g, int p)
    {
    	leiste[p] = g;
    }
    

    in das Array einsortiere. Und damit wäre mein Problem eigentlich gelöst, weil ich später die Objekte, die ich in dem Array speichern will, eh in einer anderen Klasse erstellen werde.
    Somit danke an euch 😃 👍

    Grüße,
    David



  • Wäre aber trotzdem interessant zu wissen woran es letztendlich gelegen hat. Meine neue Vermutung: Ist dein Waffenleiste Objekt eventuell ein globales, wie auch sword1 ? Wenn ja dann hast du Probleme mit der Reihenfolger in der die Objekte erstellt werden, also das Waffenleiste Objekt wird erstellt bevor das Gegenstand gültig ist. Falls dem so ist/war: Da hast du einen Grund warum globale Objekte böse sind.



  • @Velociraptor45
    Deine Gegenstand Klasse braucht übrigens einen Copy-Konstruktor.
    Sonst wird das Sprite in der Kopie weiterhin die Textur im Original verwenden. Und das wird wohl Probleme geben, falls das Original mal gelöscht wird (oder für was anderes verwendet).


Log in to reply