Frage zu Vector
-
Ich wollte ein Vector erzeugen und dabei erzeugte Stringwerte ausgeben. Nur klappt das nicht so recht. Es geht mit jedem anderem Typ (int, double...) nur nicht wenn ich mir den string reinbauen will. Hat jemand einen Tip?
#include <vector> #include <sstream> #include <string> #include <iostream> using namespace std; int main() { vector<string> v; int i; string val; for (i=0; i<7; ++i) { v.push_back(i); ostringstream Str; Str << i; string str_i(Str.str()); ++v[i]; v[i] = "text"+ str_i; cout<<v[i]<<endl; } return 0; }
-
Was klappt denn nicht? Eine Fehlerbeschreibung ist meistens ganz nützlich.
-
dixidix schrieb:
...Nur klappt das nicht so recht...
Das ist keine Ausreichende Fehlermeldung. Und wenn deine Compilermeldung ähnlich wie meine ist, ist der Fehler recht klar:
error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'int' to 'const std::string &'int läßt sich nicht implizied in std::string konvertieren. Dazu gibt es aber auch mehrere andere Einträge, u.a. in der FAQ...
cu André
-
Hm der Code wie du ihn hast kann nicht funktionieren weil du einen vector vom typ string anlegst und dann push_back mit einem int parameter aufrufst (zeile 14).
Wenn du einfach nur die strings "text0" bis "text7" in einen vector schreiben willst könntest du dein Programm etwas modifizieren:
for (i=0; i<7; ++i) { ostringstream Str; Str << i; string str_i(Str.str()); v.push_back("text" + str_i); cout<<v[i]<<endl; }/e: Mist.. 2 Antworten dazwischen.. ich sollte schneller tippen

-
Ja, die Fehlermeldung wars. Also nur ein Stellungsfehler. Manchmal sieht man den Wald vor lauter Bäumen nicht... Danke.
-
Dann noch eine Frage. Angenommen ich hätte jetzt einen Vector so wie oben in einer Klasse erzeugt und möchte den public verfügbar machen, also in einer anderen Klasse oder im Programm verwenden, wie kann ich das machen? Im ersten Moment denke ich daran es so zu machen, also etwa so:
EineKlasse.h
class EineKlasse { private: void getVectorText(); public: vector<string> v; };EineKlasse.cpp
#include <vector> #include <sstream> #include <string> #include <iostream> using namespace std; void EineKlasse::getVectorText() { int i; string val; for (i=0; i<7; ++i) { ostringstream Str; Str << i; string str_i(Str.str()); v.push_back("text" + str_i); //cout<<v[i]<<endl; } }im Programm abrufen
EineKlasse ek cout<<ek.v[2]<<endl;Ich habe das jetzt noch nicht so getestet, deswegen die Frage. Und gibt es speichertechnisch keine Probleme, wenn man einen Vector in den Klassen public hin und her schiebt. Bei statischen Arrays soll es damit ja zum Teil problematisch sein, wobei es mich auch interessieren würde wie das mit staischen Arrays von statten geht.
-
dixidix schrieb:
Dann noch eine Frage. Angenommen ich hätte jetzt einen Vector so wie oben in einer Klasse erzeugt und möchte den public verfügbar machen
Das würde ich nicht machen. Dies ist ein Verstoß gegen das Geheimnisprinzip. Du legst Teile deiner Klassenimplementierung offen, was meißt keine gute Wahl ist. Selbst wenn getter/setter-Methoden im ersten Schritt als unnötiger Balast angesehen werden, so hat man damit wenigstens etwas Kontrolle gewonnen:
1.a Man kann man irgendwann zusätzliche Prüfungen einbauen, ohne das man die Aufrufe ändern muss
1.b Wenn man später feststellt das der vector nur lesend oder nur schreibend zugegriffen werden soll (letzteres ist eher unüblich), deklariert man die entsprechende Methode einfach private compiliert und bekommt die Stellen gemeldet, wo dagegen verstoßen wird.
1.c Ich würde aber grundsätzlich überlegen ob es nicht sinnvoller ist, den Vektor gänzlich hinter der Schnittstelle zu verbergen (dann kann man diesen auch durch andere Container austauschen.
1.d Du kannst wenn du das Geheimnisprinzip bewahrst eher Änderungen an der Klasse durchführen, ohne anderen Code anzufassen.Zudem solltest du dir über sprechende Namen Gedanken machen. get... legt einen Rückgabewert nahe. Und nicht alles muß man zwangsweise in eine Klase auslagern, manchmal sind freie Funktionen besser.
dixidix schrieb:
Und gibt es speichertechnisch keine Probleme, wenn man einen Vector in den Klassen public hin und her schiebt.
Sobald du Vektoren kopierst ist dies eine Performancefrage. Wenn du nur eine Funktion zum Füllen brauchst, würde ich dieser je nach Fall eine Referenz oder konstante Referenz übergeben (dann wird nichts kopiert, sondern das Original verwendet).
dixidix schrieb:
Bei statischen Arrays soll es damit ja zum Teil problematisch sein, wobei es mich auch interessieren würde wie das mit staischen Arrays von statten geht.
Den Zusammenhang verstehe ich jetzt nicht.
cu André