Vector-Übergabe by reference
-
Hallo,
Ich lese aus einer Datei Daten im selbstdefinierten Format (struct) in einen Vector.
TZO_Gruppe_Berechtigung ZO_Gr_Br; ifstream inZO_Gr_Br(("c:\\Test-Verzeichnis" + "\\" + "test.dat").c_str(), ios::binary); while (inZO_Gr_Br.read((char*)&ZO_Gr_Br, sizeof(ZO_Gr_Br))) { gvZO_Gruppe_Berechtigung.push_back(ZO_Gr_Br); } inZO_Gr_Br.close();
Funktioniert wie gewünscht.
Für die geplante Anwendung ist es jedoch erforderlich, einen Methodenaufruf zwischenzuschalten, der als Rückgabe den gefüllten Vector enthält.
z.B.
sub_Hole_ZO_Gruppe_Berechtigung(vector<TZO_Gruppe_Berechtigung> &gvZO_Gruppe_Berechtigung)
Habe mich aber bisher vergeblich an einer by reference-Übergabe/Rückgabe in Zusammenhang mit Vector versucht.
Hat jemand eine Idee, oder taugt vielleicht der Ansazt nicht?
Gruß
Leo
-
Leo Freitag schrieb:
Hallo,
Ich lese aus einer Datei Daten im selbstdefinierten Format (struct) in einen Vector.
TZO_Gruppe_Berechtigung ZO_Gr_Br; ifstream inZO_Gr_Br(("c:\\Test-Verzeichnis" + "\\" + "test.dat").c_str(), ios::binary); while (inZO_Gr_Br.read((char*)&ZO_Gr_Br, sizeof(ZO_Gr_Br))) { gvZO_Gruppe_Berechtigung.push_back(ZO_Gr_Br); } inZO_Gr_Br.close();
Funktioniert wie gewünscht.
Sicher?
(("c:\\Test-Verzeichnis" + "\\" + "test.dat").c_str(),
Hier werden nicht Strings konkateniert sondern einfach Adressen addiert.
-
Referenzen auf container sollten ohne prob gehen ... sehe auch nicht richtig falsches bei dir ... zumindest was den vector angeht ...
Bei deinen bezeichnungen krieg ich auch irgendwie augenkrebs ... aber das kann gewoehnungssache sein ... kenn die bezeichnungen ned ....
aber ....
TZO_Gruppe_Berechtigung ZO_Gr_Br;
while (inZO_Gr_Br.read((char*)&ZO_Gr_Br, sizeof(ZO_Gr_Br)))was ist TZO_Gruppe_Berechtigung fuern typ ?
kannst den so ohne weiteres auf nen char * casten und dann ueberschreiben ?
und der CCtor von dem typ funzt dann auch noch einwandfrei ?BTW C-casts in c++ = poese !!!
Anmerkung:
vector<xaz_Typ> in Parametern usw, mag ich ned so. aenderst einmal den typ, hast die schreibarbeit an 100 stellen. ausserdem find ichs umstaendlich, dass volle template auszuschreiben, um bspsweise iteratoren zu deklarieren ....
mach typedefs ! noch besser kapsel deine container in klassen, mit userfreundlichereren schnittsellen .... macht am anfang mehr arbeit, kann sich aber unter umstaenden spaeter wirklich lohnen ...
Edit:
und das mit der string concatination hab ich gar ned gesehen ... omgCiao ...
-
RHBaum schrieb:
Bei deinen bezeichnungen krieg ich auch irgendwie augenkrebs
Ich wollte nicht so direkt sein, aber:
-
Hi,
Du hast gesagt das
sub_Hole_ZO_Gruppe_Berechtigung
eine Methode ist richtig ? Dann gehört sie zu einer Klasse. Also gib der Klasse nen member und gibt ne const reference zurück wenns denn unbedingt sein muss. Deine Lösung ist doch auch ok mal btw.
class foo{ public: typedef std::vector<ZO_Gr_Br> nicetype; //naja finde halt nen schöneren namen const nicetype &bar(void){ //..... return myvec_; } private: nicetype myvec_; };
Naja oder so halt. Du kannst nicht ein lokales object per referenz zurück geben, falls du das probiert haben solltest. Warum weisst du auch wenn du dir mal die Lebenszeit von deinem objekt anguckst.
-
Hallo,
Bei deinen bezeichnungen krieg ich auch irgendwie augenkrebs ... aber das kann gewoehnungssache sein ... kenn die bezeichnungen ned ....
Interessant: Immer wenn hier in der Gruppe nach Sprachkonventionen für C++ gefragt wird, heißen die Antworten: "ich mache das so und so"; "ich mache das lieber anders", "Ich finde die ungarische Notation blöd" usw. - Der Anfänger staunt!
Oftmals wenn man hier postet, erhält man Kommentare wie den obigen: "Schlechter Code", "unlesbar", "kryptisch" etc.
Mein Vorschlag für die Zukunft: wenn meckern, dann auch Verbesserungsvorschläge liefern.BTW C-casts in c++ = poese !!!
Würdest Du mir auch noch verraten warum?!
Gruß
Leo
-
Funktioniert wie gewünscht.
Sicher?
(("c:\\Test-Verzeichnis" + "\\" + "test.dat").c_str(),
Hier werden nicht Strings konkateniert sondern einfach Adressen addiert.
Ja, funktioniert (seit Monaten). Aber egal, bin natürlich trotzdem interessiert, wie 'man' es denn besser machen könnte.
Und, warum kein C-cast in C++?Gruß
Leo
-
Leo Freitag schrieb:
BTW C-casts in c++ = poese !!!
Würdest Du mir auch noch verraten warum?!
Mit C++ casts kann man genauer erkennen, wozu der Cast benutzt wird. Bei (T)a kann kein Schwein erkennen, ob man jetzt die constness wegastet, einen inheritance-cast durchführt oder was anderes macht, was wahrscheinlich gar nicht hin gehört.
-
Leo Freitag schrieb:
Und, warum kein C-cast in C++?
Weil sie mehr Sicherheit bieten. Du kannst zB nicht "aus Versehen" die constness wegcasten, dafür musst du schon explizit const_cast nehmen.
Leo Freitag schrieb:
Interessant: Immer wenn hier in der Gruppe nach Sprachkonventionen für C++ gefragt wird, heißen die Antworten: "ich mache das so und so"; "ich mache das lieber anders", "Ich finde die ungarische Notation blöd" usw. - Der Anfänger staunt!
Ja, auch wenn verschiedene Sprachkonventionen genutzt werden, so beschränkt sich doch die Auswahl in den meisten Punkten auf wenige sinnvolle Möglichkeiten. Und bei einigen Sachen ist die Meinung mittlerweile ziemlich einheitlich, zB ist die ungarische Notation bei den meisten erfahrenen C++ Programmierern "deprecated"
.
Leo Freitag schrieb:
Oftmals wenn man hier postet, erhält man Kommentare wie den obigen: "Schlechter Code", "unlesbar", "kryptisch" etc.
Nun, das liegt daran, dass dein Code auch relativ kryptisch aussieht.
Du kannst übrigens im C++ Forum auch C++ Code-Tags verwenden.
-
Kann mir irgend jemand erklären, warum das hier funktionieren soll:
(("c:\\Test-Verzeichnis" + "\" + "test.dat").c_str()Leuchtet mir NULL ein
-
Das funktioniert ja auch nicht. Wer erzählt denn sowas? Da C++ leider keine echten builtin Strings hat, kannst du auch keine String Literale verknüpfen, zumindest nicht so. Das funktioniert nur mit ##. Versteh sowieso nicht warum man anstatt
"c:\\Test-Verzeichnis" + "\\" + "test.dat"
nicht gleich
"c:\\Test-Verzeichnis\\test.dat"
schreibt.