Objektpointer und der Gültigkeitsbereich...
-
Mir ist da grad eine idee gekommen wie ich das lösen könnte. Was haltet ihr davon:
Std::vector<MyClass> load(){ std::vector<MyClass> v; MyClass* mc = new MyClass; //einstellungen vornehmen für mc mc->setName("startgame"); v.push_back(mc); MyClass* mc2 = new MyClass; //einstellungen vornehmen für mc2 mc->setName("settings"); v.push_back(mc2); return v; } Int main(){ std::vector v = load(); For(int i = 0; i < v.size() - 1; i++){ if(v[i].getName() == "settings"){ //settings wurde gefunden hurra //arbeite mit diesem } return 0; }Man kann diese suchschleife in eine funktion packen, der man den suchstring und den vector übergibt und die dann die arraynummer zurückgibt.
Etwa so:
Int getArrayNum(std::string, std::vector){...}
-
Nicht so viel, da
SeppJ schrieb:
Besser: Gar nicht so etwas programmieren. Ein mit new erstelltes Objekt über einen rohen Zeiger aus einer Funktion herausgeben ist äußerst unsauber und provoziert Fehler en masse.
Wenn ich den Code richtig verstehe, ist die Anwendung von new doch gar nicht
notwendig.
Du kannst ein Objekt doch einfach so erzeugen, also z.B.:myclass mc; myclass mc2;Hinzu kommmt, wenn ich das richtig verstehe, ist der von Dir erzeugte Vektor nur
innerhalb der Funktion gültig. Du gibst den Vektor zwar mittels return zurück, das ist aber für das weitere Arbeiten eher nicht so gut, da der Vektor dann nur noch temporär gültig ist.Besser wäre vemutlich den Vektor ausserhalb der Funktion,aber innerhalb der Klasse zu erzeugen.
Dann kannst Du eine Funktion schreiben, den Vektor als Referenz übergeben und dann innerhalb der Funktion damit arbeiten.
-
Ich gebe aber doch keinen rohen zeiger, sondern den Container zurück
-
Du hast den vector überhaupt nicht verstanden. Er verwaltet den Speicher für seine Objekte. Das kompiliert so doch nicht mal. Du pushst Objekte selbst in den vector, keine Pointer.
-
Also erstelle ich die obiekte kurz gefasst so
MyClass mc; ... v.push_back(mc);Und die objekte kann ich dann immernoch, mit arraynummer, erreichen?
Behandle ich dann v[] als objekt oder pointer. Wahrscheinlich als poitner wenn er den speicher selbst anlegt, oder?Dann muss ich drauf so referenzieren:
v[getArrayNum("schiessmichtotichversteheswohlimmernochnicht", v)]->setName("oderdoch?");
-
cooky451 schrieb:
Du hast den vector überhaupt nicht verstanden. Er verwaltet den Speicher für seine Objekte. Das kompiliert so doch nicht mal. Du pushst Objekte selbst in den vector, keine Pointer.
Den vector nicht. Aber ich kenne templates. Vector gehört doch nicht zu den grundlagen. Zumindest steht davon nix in meinem buch. Also vom std::vector
-
Ne, als Objekt. v[i] ist genau der Typ, den du in den eckigen Klammern angegeben hast. In deinem Beispiel wird übrigens kopiert, was bei Buttons wenig Sinn macht. Die könnte man aber movable machen.
Nur scheinen dir weder Konstruktoren, noch Destruktoren oder Kopierkonstruktor, Zuweisungsoperator etc. etwas zu sagen. Nur mal als Tipp: Du solltest hier dringend die Grundlagen lernen. Man kann sich durch rumprobieren zwar so durchwurschteln bis man etwas hat was irgendwie so läuft, aber das dauert doch wesentlich länger und zahlt sich sicher nicht aus.
C++ Primer ist die übliche Buchempfehlung.
-
Könnte mir nicht einfach jmd sagen, was konkret an meiner idee falsch ist oder sie direkt dazu ums hreiben? Normal versteh ich doch alles wenn mir was erklärt wird, zumindest wenn es sich auf die grundlagen bezieht...

-
kralo9 schrieb:
cooky451 schrieb:
Du hast den vector überhaupt nicht verstanden. Er verwaltet den Speicher für seine Objekte. Das kompiliert so doch nicht mal. Du pushst Objekte selbst in den vector, keine Pointer.
Den vector nicht. Aber ich kenne templates. Vector gehört doch nicht zu den grundlagen. Zumindest steht davon nix in meinem buch. Also vom std::vector
Vektoren sind unheimlich wichtig, da sie sehr oft vorkommen.
Und gehören daher definitiv zu den Grundlagen.Zunächst einmal geht es ja nur um das einfache Anwenden, nicht um das detaillierte Verständnis eines Klassentemplates (was Vektoren ja sind).
-
Zunächst einmal geht es ja nur um das einfache Anwenden, nicht um das detaillierte Verständnis eines Klassentemplates (was Vektoren ja sind).
Und wie würde das dann bei meiner Idee aussehen?!

-
kralo9 schrieb:
Ich gebe aber doch keinen rohen zeiger, sondern den Container zurück
Ja, und soweit ich das weiß, wird dann der komplette Vektor übergeben, anstatt nur eine Referenz oder ein Zeiger darauf. Bei größeren Vektoren kann das durchaus
spürbare Geschwindigkeitsnachteile zur Folge haben.
Hinzu kommt, der Vektor als Rückgabewert ist im Prinzip nur noch temporär gültig.
Weiteres Arbeiten damit dürfte ziemlich umständlich, wenn nicht sogar unmöglich sein.
-
redrew99 schrieb:
Ja, und soweit ich das weiß, wird dann der komplette Vektor übergeben, anstatt nur eine Referenz oder ein Zeiger darauf. Bei größeren Vektoren kann das durchaus
spürbare Geschwindigkeitsnachteile zur Folge haben.Falsch, siehe RValue-Referenzen und RVO.
redrew99 schrieb:
Hinzu kommt, der Vektor als Rückgabewert ist im Prinzip nur noch temporär gültig.
Weiteres Arbeiten damit dürfte ziemlich umständlich, wenn nicht sogar unmöglich sein.Quatsch.
#include <iostream> #include <string> #include <vector> struct mystruct { std::string name; mystruct(std::string name) : name(std::move(name)) {} }; std::vector<mystruct> gimme_more_objects() { std::vector<mystruct> v; v.push_back(mystruct("Hallo")); v.push_back(mystruct("Welt!")); return v; } int main() { std::vector<mystruct> v = gimme_more_objects(); for (std::size_t i = 0; i != v.size(); ++i) std::cout << v[i].name << '\n'; }
-
Auf die geschwindigkeit kommt es mir hier nicht an, da die texturen nur bei programmstart geladen werden. Also die funktion wird nur einmal aufgerufen.
Und ganz nebenbei: wenn das laden ewig dauert wirkt mein spiel wie eins der professionell enteickelten wie die von ea und so :D:D
-
kralo9 schrieb:
Zunächst einmal geht es ja nur um das einfache Anwenden, nicht um das detaillierte Verständnis eines Klassentemplates (was Vektoren ja sind).
Und wie würde das dann bei meiner Idee aussehen?!

Z.B.
void test(vector<int>&myvector,int &a) { myvector.push_back (a); }
-
cooky451 schrieb:
#include <iostream> #include <string> #include <vector> struct mystruct { std::string name; mystruct(std::string name) : name(std::move(name)) {} }; std::vector<mystruct> gimme_more_objects() { std::vector<mystruct> v; v.push_back(mystruct("Hallo")); v.push_back(mystruct("Welt!")); return v; } int main() { std::vector<mystruct> v = gimme_more_objects(); for (std::size_t i = 0; i != v.size(); ++i) std::cout << v[i].name << '\n'; }Dazu 2 fragen:
Was bringt beim konstruktor beim initialisieren der variable name das std::move? Mir wäre name(name) geläufiger..Wieso wird in main der vectortyp als v gekennzeichnet? Ein vector in einem vector? Woher weiss er was v ist? Das muss doch fehler geben!
Edit. Ach du hast das schon geändert

-
kralo9 schrieb:
Was bringt beim konstruktor beim initialisieren der variable name das std::move? Mir wäre name(name) geläufiger..
Das move ist C++11 Kram, damit wird der Speicher einfach übergeben, und keine Kopie angelegt. Ist für dich aber vielleicht erstmal egal.
-
cooky451 schrieb:
int main() { std::vector<mystruct> v = gimme_more_objects(); }Welchen Sinn macht es bei dem Beispiel, erst einen Vektor innerhalb einer Funktion zu erzeugen und diesen dann einem neuen Vektor zuzuweisen?
Warum den Vektor nicht gleich ausserhalb der Funktion erzeugen und per Referenz/Zeiger übergeben?
-
redrew99 schrieb:
cooky451 schrieb:
int main() { std::vector<mystruct> v = gimme_more_objects(); }Hier wird aber doch der aus der Funktion zurückgegebene Vektor einem neuen
Vektor zugewiesen.Wäre eine Funktion mittels Übergabe des Vektors als Referenz nicht besser?
Nein weil der vector nach der rückgabe seinen gültigkeitsbereich verlässt und man somit eine referenz auf nix erhählt bzw auf irgendwas. Aber nicht das was man will.
-
kralo9 schrieb:
Nein weil der vector nach der rückgabe seinen gültigkeitsbereich verlässt und man somit eine referenz auf nix erhählt bzw auf irgendwas. Aber nicht das was man will.
Richtig, man soll den Vektor ja auch ausserhalb der Funktion erzeugen und ihn dann per Referenz übergeben.
-
redrew99 schrieb:
Warum den Vektor nicht gleich ausserhalb der Funktion erzeugen und per Referenz/Zeiger übergeben?
Weil's anders hübscher ist.