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,
DavidPS: 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.
-
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];
-
@Velociraptor45
https://en.wikipedia.org/wiki/Object_slicing
Lesen. Wichtig.
-
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/88umsoum 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 Methodevoid 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 euchGrüß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
DeineGegenstand
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).