Vector als Rückgabewert
-
Das ist ne üble C/C++ mischung!

-
@deejay: danke! genau das war es! mein printf hat natürlich die ganze ausgabe zerstört, vielen dank für deine hilfe....
so, zurück zum Thema:
ich gebe jetzt wie vorgeschlagen beim getSupportBands den Vektor als Referenz zurück, die Ausgabe ist jetzt auch richtig, danke. Nur damit ich das auch verstehe, wenn ich den vektor in getSupportBand als Wert zurück liefere wird dieser kopiert, müsste es dann nicht trotzdem funktionieren? oder warum ist dann nur das erste Element falsch?
-
btw:
Das du hier std::vector ad absurdum führst ist dir schon klar, oder?
Und immer schön wieder Speicher freigeben am Ende..
-
Du kopiert jedesmal einen neuen Vektor beim Rückgabe wert. Daher sind die Adressen bei end() auch immer unterschiedlich und du erhältst verschiedene Iteratoren. Eigendlich sollte das abstürzen.
-
Ohne referenz sieht das so aus:
#include <iostream> using namespace std; int main() { Concert *con = new Concert; con->addSupportBand("Velvet Underground"); con->addSupportBand("Black Angels"); con->addSupportBand("The Duke Spirit"); std::vector<std::string> buf = con->getSupportBands(); for (std::vector<std::string>::iterator itt = buf.begin(); itt != buf.end(); ++itt) { cout << (*itt) << endl; } delete con; }Durch das Zwischenspeichern in buf bleiben die Zeigeradressen (iterator ist nix anderes) valid da sie vom selben container stammen
-
@NAJA: ok, danke, das ist einläuchtend.
drakon schrieb:
btw:
Das du hier std::vector ad absurdum führst ist dir schon klar, oder?
Und immer schön wieder Speicher freigeben am Ende..nein, ist mir nicht klar (wirklich nicht), warum?
und keine sorge, im eigentlichen Programm geb ich den Speicher auch wieder frei, das war halt nur der entscheidende Teil den ich hier reinkopiert habe.
-
edwood schrieb:
@NAJA: ok, danke, das ist einläuchtend.
drakon schrieb:
btw:
Das du hier std::vector ad absurdum führst ist dir schon klar, oder?
Und immer schön wieder Speicher freigeben am Ende..nein, ist mir nicht klar (wirklich nicht), warum?
und keine sorge, im eigentlichen Programm geb ich den Speicher auch wieder frei, das war halt nur der entscheidende Teil den ich hier reinkopiert habe.Vielleicht meint er weil deine Klasse kaum einen Sinn ergibt weil du vector auf ein push_back reduzierst. Somit könntest du auch einfach
typedef std::vector<std::string> Concert_tschreiben und bräuchstest keine Klasse.
Jedoch ist das sicherlich nur ein klitzekleiner Ausschnitt deines Programms, richtig?

-
Ich weiß auch nicht schrieb:
...
Zum einen das und zum anderen wüsste ich nicht, warum man einen Standardcontainer per new ( ob in einer Klasse gewrappt, oder nicht ) anfordern sollte.

-
ich verstehe das problem noch immer nicht, wie ich nämlich schon mal erwähnt habe, ist der gepostete code nur ein kleiner _teil_ vom ganzen, damit ist auch die klasse gemeint die natürlich nicht nur aus einem vector besteht.
-
was hältst du davon:
#include <vector> #include <string> class Concert { public: typedef std::vector <std::string> bandContainer; const bandContainer& getSupportBands() const { return supportBands; } void addSupportBand(const std::string &name) { supportBands.push_back(name); } private: bandContainer supportBands; };#include <iostream> #include "concert.h" int main () { Convert bla; //füllen for (Concert::bandContainer::const_iterator iter(bla.getSupportBands().begin()), end(bla.getSupportBands().end()); iter != end; ++iter) { std::cout << "Support-Band: " *iter << "\r\n"; } }bb