Vector in Methode



  • 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.


  • Mod

    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!


  • Mod

    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.
    //...
    }
    

  • Mod

    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::i klar 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 ...


  • Mod

    VIVUSorg schrieb:

    v.trigo_berechnen(t1)

    Das ist v von Verarbeiten. Wenn ich das nicht tue, sagt er mir, es wäre nicht deklariert ...

    Das ist wieder das gleiche wie vorher mit dem p. Du legst wild und ohne Plan Objekte an, weil der Compiler meckert, ohne zu verstehen, warum er meckert. Das v hat mit deinem aktuellen Objekt nichts zu tun.

    Dein Design ist wirklich sehr komisch.



  • Solange das Design nur komisch ist, aber funktioniert, macht das nichts 🙂

    Wie kann ich dem Compiler denn sagen, dass die Funktion deklariert ist?

    Ich habe jetzt nur noch in der main() Parser p; und Verarbeiten v; oder kann ich hier auch durch das vererben Parser p; weglassen?



  • ...


Anmelden zum Antworten