Vector in Methode


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



  • ...



  • VIVUSorg schrieb:

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

    Funktioniert aber nicht.



  • In der main() habe ich Parser p; und Verarbeiten v; und sonst habe ich keine neuen Objekte erstellt.

    Wie soll ich denen dann die Methode in der MainParser Methode aufrufen? Hängt das mit der Vererbung zusammen? Oder sind in der Main zu viele Objekte erstellt? In welche Richtung soll ich nachlesen? Ich muss/will ja im Prinzip eine Basis Methode in einer Methode der Oberklasse nutzen.

    // Edit: Stimmt, funktionieren tuts leider nicht. Du könntest mir aber sagen, was du mit komisch meinst. Nur komisch ist ziemlich schwer zu interpretieren...



  • VIVUSorg schrieb:

    In der main() habe ich Parser p; und Verarbeiten v; und sonst habe ich keine neuen Objekte erstellt.

    Und woher kommt dann v in der Memberfunktion?

    Wie soll ich denen dann die Methode in der MainParser Methode aufrufen?

    (pure) virtual Memberfunctions

    Hängt das mit der Vererbung zusammen?

    Jein.

    Oder sind in der Main zu viele Objekte erstellt?

    Ja.

    In welche Richtung soll ich nachlesen?

    Im Forum ist ein Thread über die Bücher, Link dazu in SeppJs Signatur.

    Ich muss/will ja im Prinzip eine Basis Methode in einer Methode der Oberklasse nutzen.

    Basis und Oberklasse ist idR dasselbe.

    Du könntest mir aber sagen, was du mit komisch meinst. Nur komisch ist ziemlich schwer zu interpretieren...

    Angefangen mit:
    Verarbeiten ist nicht Parser.
    Wurstbrot ist Supermarkt, aber Verarbeiten ist nicht Parser.


  • Mod

    VIVUSorg schrieb:

    // Edit: Stimmt, funktionieren tuts leider nicht. Du könntest mir aber sagen, was du mit komisch meinst. Nur komisch ist ziemlich schwer zu interpretieren...

    Das war eigentlich die höfliche Art zu sagen "totaler Mist". Da wollte ich mal einmal nicht so negativ sein und schon kommt es auch falsch an.



  • Anstelle von Verarbeiten hätte ich auch Executor nehmen können 🙂 Und Verarbeiten ist nicht Parser ist klar, wollte ich auch nicht nutzen, falls ich das getan hab 🙂

    Im Grunde wollte ich das zerflücken und das anschließende weiterverarbeiten in zwei klassen trennen. Um voran zu kommen, werde ich die Methode aber in Parser stecken... und erstmal abwarten, bis Vererbung in der Vorlesung an die Reihe kommt 🙂 Ich weiß, der einfache Weg ist nicht immer der Beste...


  • Mod

    VIVUSorg schrieb:

    Anstelle von Verarbeiten hätte ich auch Executor nehmen können 🙂 Und Verarbeiten ist nicht Parser ist klar, wollte ich auch nicht nutzen, falls ich das getan hab 🙂

    Genau das hast du aber getan, denn diese Beziehung wird durch die (public) Vererbung ausgedrückt. Das Beispiel von Nathan mit dem Wurstbrot und dem Supermarkt ist ein Beispiel aus dem schrecklich schlechten Lehrbuch "C++ von A bis Z", dessen Autor (J. Wolf) ebenfalls Vererbung nicht kapiert hat. Der ist hier so eine Art Forenlegende, da fast alle dummen Fragen (ja, die gibt es) hier im Forum darauf zurückgehen, dass der Fragesteller eines seiner Bücher gelesen hat.


Anmelden zum Antworten