Vector in Methode
-
Hallo,
ich versuche mal anhand von Beispielen zu erklären, was ich meine

Als erstes habe ich meine Klasse Praser:
class Parser { public: void MainParser(string daten); vector<double> x; vector<char> y; private: bool h; int c1; };In der Methode MainPraser nehme ich einen String, welcher durch ein cin eingelesen wird auseinander und schreibe einzelne Werte in den Vector x und andere Werte in den Vector y (einmal Zahlen und das andere mal Zeichen) mit z.B. p.x.pushback(wert);
Wenn ich innerhalb der Methode auf den Vector x oder y zugreifen will, klappt das wunderbar. Will ich aber in der main(), nachdem ich die Methode mit
String t1 = "Hallo 654"; // Hier will ich z.b. alle Zahlen in den Vektor x und Zeichen in den Vector y Parser p; p.MainParser(t1);aufgerufen habe, auf den vector x oder y zugreifen, bekomme ich einen Compiler Fehler.
Kann es sein, dass wenn ich Daten in einen Vector innerhalb einer Schleife schreibe, dass diese Daten dann nur innerhalb der Schleife im Vector enthalten sind?Gruß
-
...
-
Hier mein Code...
Habs die Stellen, wo ich den Vector ausgeben kann kommentiert. In der gesamten Funktion nutze ich nur die Funktion push_back() um etwas in den Vektor zu schreiben. Ansonsten wird der Vektor nicht genutzt.
#include <iostream> #include <math.h> #include <string> #include <vector> #include <iterator> #include <algorithm> using namespace std; #define PI 3.14159265 class Parser { public: string checkWhitespaces(string whitespaces); // Methode wird angelegt - Whitespace löschen bool checkZahl(char wert); // - Auf Zahl prüfen double MainParser(string daten); vector<double> Zahlen; vector<char> Zeichen; private: bool h; int c1; }; void Parser::MainParser(string t1) { Parser p; // Klasse wird zugewiesen Verarbeiten v; for(int i = 0; i < t1.length(); i++) { switch(t1[i]) { // ... p.Zahlen.push_back(trigo_berechnen); // ... } // Switch Ende } // for-Schleife Ende // Hier kann ich beide Vectoren ausgeben // } // MainPraiser Ende int main() { Parser p; Verarbeiten v; string t1; t1 = "asgb 84515"; p.MainParser(t1); // Hier bekomme ich keine Ausgabe... bool z = true; int xy = 0; do { if(p.Zahlen.size() > xy) { cout << "Der " << xy << ". Vektor: " << p.Zahlen[xy] << endl; xy++; } else { z = false; } } while(z); return(0); } // main() Ende
-
warum erstellst du dir in Parser::MainParser() ein neues Parser Object? (das ist übrigens dein Fehler)
-
Weiß leider nicht was du meinst...

-
Du erstellst dir in der main Funktion ein "Parser p" Object. Über dieses Object rufst du die Methode MainParser() auf. In dieser Methode erstellst du wiederum ein "Parser p" Object, dessen vector du dann befüllst. Nachdem du aus der Methode raus gesprungen bist (zurück in die main), versuchst du dir den vector des Parser Objects aus der main Funktion auszugeben, was aber logischer Weise keine Werte enthält.
EDIT:
do { if(p.Zahlen.size() > xy) { cout << "Der " << xy << ". Vektor: " << p.Zahlen[xy] << endl; xy++; } else { z = false; } } while(z);Dieses Konstrukt ist auch mehr als Mysteriös.
Letztendlich würde eine for Schleife reichen:for (int xy = 0; xy < p.Zahlen.size(); ++xy) cout << "Der " << xy << ". Vektor: " << p.Zahlen[xy] << endl;
-
Wenn ich Parser p; aus der Methode nehme, bekomm ich einen Compiler Fehler.
Mit der Schleife hast du wohl recht, aber man will ja noch was lernen
Danke für den Tipp!
-
Ahh ich verstehe... mist

-
VIVUSorg schrieb:
Wenn ich Parser p; aus der Methode nehme, bekomm ich einen Compiler Fehler.
Dann hast du da wohl noch mehr Fehler.
-
VIVUSorg schrieb:
Wenn ich Parser p; aus der Methode nehme, bekomm ich einen Compiler Fehler.
Du willst doch sicher auf dem aktuellen Objekt arbeiten. Also
p.Zahlen.push_back(trigo_berechnen);
Zahlen.push_back(trigo_berechnen);Bitte noch einmal angucken, was es mit Memberfunktionen auf sich hat und wie sie genau funktionieren.
-
Jo, habs. Es klappt! Besten Dank!
-
VIVUSorg schrieb:
Jo, habs. Es klappt! Besten Dank!
Aber wichtig: Verstehst du den Unterschied? Was deine Variante bedeutete und was bei der Korrektur anders ist?
Das sind ganz wichtige Themen, wenn da bei dir noch Restzweifel bestehen, dann ist ein Blick ins Lehrbuch angesagt (-> zweiter und vierter Link in meiner Signatur).
-
Nene, habs verstanden. Ich dachte man müsse in jeder Methode nochmal die Klasse bekannt machen... was im nach hinein totaler Schwachsinn ist
Auch ists logisch dann die "p." vor den vectoren zu entfernen, da man sich ja innerhalb der Klasse befindet ... 
Danke!
-
Hallo nochmal,
hätte da noch eine weitere Frage zum ähnichen Thema.
Wenn ich zu meiner Klasse Parser noch eine Variable i hinzufüge:
class Parser { public: string checkWhitespaces(string whitespaces); // Methode wird angelegt - Whitespace löschen bool checkZahl(char wert); // - Auf Zahl prüfen double MainParser(string daten); vector<double> Zahlen; vector<char> Zeichen; int i; private: bool h; int c1; }; class Verarbeiten : public Parser { public: double zusammenfassen(string t1); private: };und dann eine Methode in der Klasse Verarbeiten anlege, welche von Parser erbt. Wie kann ich dann in einer Methode von Parser in der die Variable i hochgezählt wird, in einer Methode von Verarbeiten weiter hoch zählen?
Sprich:
void Verarbeiten::zusammenfassen(...) { ... i++; // <<-- Dieses i will ich von weiter hochzählen ... } void Parser::MainParser(...) { //.. i++; ... zusammenfassen(...); // Hier sollte i dann entsprechend einen höheren Wert habe, wenn die Funktion zusammenfassung() i hochgezählt hat. //... }
-
Sofern das Ding nicht private ist, kannst du es in erbenden Klassen so benutzen, als ob es ein ganz normaler Member wäre. Falls es Doppeldeutigkeiten zwischen mehreren i's geben sollte, kannst du diese mittels
Parser::iklar machen, welches du meinst.
-
hm bei mir gehts einfach nicht... wenn ich in der Methode parser::i nutze, gibt er mir -86xxxxxxx aus ... dh. das es nur die Variable ist, die angelegt wurde. Aber in der Methode war diese noch nicht.
Hier mal mein Code:
#include <iostream> #include <math.h> #include <string> #include <vector> #include <iterator> #include <algorithm> using namespace std; #define PI 3.14159265 class Parser { public: string checkWhitespaces(string whitespaces); // Methode wird angelegt - Whitespace löschen bool checkZahl(char wert); // - Auf Zahl prüfen void MainParser(string &daten); vector<double> Zahlen; vector<char> Rechenzeichen; int i; private: bool h; int c1; }; class Verarbeiten : public Parser { public: double punkt_vor_strich(vector<double> &Z, vector<char> &RZ); double erg_berechnen(vector<double> &Z); double trigo_berechnen(string t1); private: }; void Parser::MainParser(string &t1) { int temp = 0; int c2 = 0; h = true; c1 = 0; for(i = 0; i < t1.length(); i++) { switch(t1[i]) { //... i++; //... // wenn hier i = 5 ist, i auch nach der Funktion 5 Zahlen.push_back(v.trigo_berechnen(t1)); // Innerhalb der Funktion ist i = -85xxxxxxx //... } // Switch Ende } // for-Schleife Ende } // MainPraiser Ende double Verarbeiten::trigo_berechnen(string t1) { i++; return trigo_berechnen2; }
-
Wird i initialisiert?
Übrigens, wenn nur Parser und Verarbeiten i nutzen kannste es auch protected machen. Aber irgendwie finde ich dein Design komisch.
-
Deklariert in der Parser Klasse und initialisiert in der for-Schleife.
-
Was ist v?
Jetzt sag nicht ein Objekt vom Typ Verarbeiten...
-
v.trigo_berechnen(t1)
Das ist v von Verarbeiten. Wenn ich das nicht tue, sagt er mir, es wäre nicht deklariert ...