member-funktion will nicht



  • gerade bin ich dabei eine graphen implementation auszuprobieren.

    dazu habe ich 2 klassen gebaut:
    knoten - speichert den inhalt eines knoten plus zeiger auf den nächsten knoten
    enthält member funktion finde, um knoten zu finden
    kanten - speichert einen oder mehrere kanten mit zeiger auf knoten.

    nun habe ich die memberfunktionen ausserhalb definiert.

    Knoten* Knoten::finde(inhalt k)
    {
    		Knoten *p_aktuell = p_erster;
    		bool weiter = true;
    
    		int i = 0;
    		while ((p_aktuell != NULL) && (weiter))
    		{
    			if (p_aktuell->key == k)
    			{
    				weiter = false;
    			}
    			else
    			{
    				p_aktuell = p_aktuell->p_naechsterKnoten;
    				i++;
    			}
    		}
    		return p_aktuell;	
    }
    

    will ich nun finde von ausserhalb aufrufen, z.b. um eine neue kante einzufügen, dann bekomme ich eine fehlermeldung.

    ich habe die beiden klassen schon gegeneinander friend gemacht...
    er kommt immer mit der meldung "finde nichtdeklarierter bezeichner"

    wenn ich finde so aufrufe Knoten::finde(a.key); ist die meldung weg, aber dann sagt er: Unzulässiger aufruf einer nicht statischen memberfunktion... 😕

    wie kann ich den compiler dazu überreden doch finde zu benutzen??



  • Morgen,

    dir ist klar, dass du von Knoten eine Instanz haben musst, mit der du arbeiten
    kannst?

    Um auf Elementfunktionen von Klassen zugreifen zu koennen, gibt es zwei
    Moeglichkeiten, die da waeren:

    Zugriff auf eine statische Elementfunktion:
    Du hast eine statische Elementfunktion definiert, welche _nicht_ den this-Zeiger
    implizit mitfuehrt und somit ohne eine Instanz der Klasse aufgerufen werden
    kann:

    class MyClass {
        private:
        public:
            static int test() {
                return 1;
            }
    };
    
    //aufruf z. B.:
    int i = MyClass::test();
    

    Innerhalb von statischen Elementfunktionen kannst du _nicht_ auf Klassen-
    variablen zugreifen. Der Grund ist, dass der this-Zeiger, wie schon erwaehnt,
    nicht mitgefuehrt wird und somit der Bezug zum Objekt fehlt. Das ist auch klar,
    denn wir rufen die Funktion ohne eine Instanz der Klasse auf, s. o. Code.

    Die zweite Moeglichkeit ist, ganz normal eine Instanz zu erstellen und mit
    dieser zu arbeiten:

    class MyClass {
        private:
        public:
            int test() const {
                return 1;
            }
    };
    
    //aufruf
    MyClass myClass;
    int i = myClass.test();
    

    mfg
    v R


Anmelden zum Antworten