Fehlermeldung bei Methode



  • Hallo Leute, ich beschäftige mich momentan bis zum erbrechen mit Übergabe von Objekten an Methoden sowie die Rückgabe davon an einen Aufrufer, damit das ganze bei mir in Fleisch und Blut übergeht OOP ist nämlich ein sehr umfangreiches Thema. Die Anfänglichen Versuche klappten bei mir schon ganz gut, doch jetzt bin ich über eine Fehlermeldung gestolpert.

    Erstmal zu dem wie ich vorgegangen bin. Schritt 1: Ich habe eine globale Funktion geschrieben die zwei Objekte übergeben bekommt, dies habe ich auf allen drei Wegen gemacht Call-by-Value, Call-by-Reference(Pointer/References). Das hat super geklappt. Die Funktion hat die Objekte verglichen und das gewünschte ausgegeben.

    Schritt 2: Ich habe die Funktion erweitert, nun vergleicht sie die Objekte und gibt das gewünschte Objekt zurück an den Aufrufer. Ebenfalls habe ich alle drei Varianten ausprobiert.

    Schritt 3: Ich habe überlegt, nun möchte ich den ganzen Aufwand noch weiter reduzieren, ich schreibe die Funktion als Methode nun in meine Klasse rein. Doch das funktionierte nicht, ehrlich gesagt verstehe ich auch nicht was der mir damit sagen will. Es ging einfach darum, dass ich auf ein Objekt nun die Methode anwende und nun noch das andere Objekt lediglich übergeben muss.

    Nun zum Code, welchen ich soweit wie möglich gekürzt habe:

    // circle.h
    class Circle
    {
    private:
        double radius;
    
    public:
        double getRadius(void) const;
    
        Circle* getBiggestCircle(Circle*); // Diese Methode verursacht die Probleme
    };
    

    Und nun meine Quelldatei:

    // circle.cpp
    double Circle::getRadius(void) const
    {
        return this->radius;
    }
    
    Circle* Circle::getBiggestCircle(Circle* kreis)
    {
        if(this->radius > kreis->getRadius())
            return this;
        else
            return kreis;
    }
    

    Die Fehlermeldung kommt bei mir mit dem g++ unter Ubuntu:

    circle.cpp:36:47: error: no ‘Circle* Circle::getBiggestCircle(Circle*)’ member function declared in class ‘Circle’
    

    Ich weiß echt nicht was ich falsch gemacht habe, oder habe ich irgendwas übersehen. Passiert ja zT sehr schnell wenn man wie ich nur mit Editor und Terminal arbeitet.

    Gruß Infty



  • Zeig bitte vollständige Dateien. Hast du z.B. den Header inkludiert?



  • Also jetzt mal die Dateien circle.h und circle.cpp. In der main.cpp habe ich noch kein Objekt erzeugt wollte erstmal sichergehen, dass der compiler es auch tut.
    Nun:

    // Circle.h
    #include <iostream>
    #include <cmath>
    
    class Circle
    {
    private:
    	// Eigenschaften
    	double radius;
    
    public:
    	// Konstruktordeklaration
    	Circle(double = 0.0);
    
    	// Destruktordeklaration
    	~Circle(void);
    
    	// Zugriffsmethodendeklarationen
    	double getRadius(void) const;
    	void setRadius(double);
    
    	// Methodendeklarationen
    	double getPerimeter(void) const; // Umfang
    	double getSurface(void) const; // Fläche
    	Circle* getBiggestCircle(Circle*);
    };
    

    Und die andere Datei:

    #include "circle.h"
    
    // Konstruktordefinition
    Circle::Circle(double radius)
    {
    	this->radius = (radius >= 0) ? radius : 0;
    }
    
    // Destruktordefinition
    Circle::~Circle()
    {
    	cout << "A circle is deleted..." << endl;
    }
    
    // Zugriffsmethodendefinitionen
    double Circle::getRadius() const
    {
    	return this->radius;
    }
    
    void Circle::setRadius(double radius) 
    {
    	this->radius = (radius >= 0) ? radius : 0;
    }
    
    double Circle::getPerimeter() const
    {
    	return 2 * this->radius * M_PI;
    }
    
    // Methodendefinitionen
    double Circle::getSurface() const
    {
    	return pow(this->radius, 2) * M_PI;
    }
    
    Circle* Circle::getBiggestCircle(Circle* kreis)
    {
    	if(this->radius > kreis->getRadius())
    		return this;
    	else
    		return kreis;
    }
    
    // main.cpp
    #include "circle.h"
    
    int main(void)
    {
    	return 0;
    }
    

    So das war alles.



  • Ich sehe da kein Problem. Bereinige mal das Projekt und kompiliere neu.

    Btw:
    Für cout solltest du noch den Namensraum angeben. Also std:: oder eine using Direktive benutzen.



  • Mhm ja den Namensraum hatte ich drin, is mir grad nur beim kopieren durch die Lappen gegangen. Mhm ich habe schon xmal neu kompiliert. Ich bin grad irgendwie ratlos. Ich probier mal alle Dateien zu löschen und das Projekt von Grund auf neuzustarten. Aber ich bezweifel dass das was bringt. Wäre komisch wenn es dann ginge



  • Vielleicht ein kryptisches Zeichen. Nimm mal den Kommentar "Fläche" raus(Circle.h).

    Schreib "Flaeche".

    wild guess.



  • Also bei mir (MSVC++) hat das kompiliert (abgesehen von dem std und dem M_PI).

    Nur neu kompilieren reicht da möglicherweise nicht. Da solltest du alle Dateien, die erzeugt werden löschen und dann nochmal neu kompilieren, damit die neu erzeugt werden.



  • Ihr werdet es nicht glauben... o.O Ich habe den Ordner gelöscht wo das Projekt drin war, hab neu angelegt, die Dateien main.cpp, circle.h und circle.cpp auch. Habe diesmal ohne die Methoden für die Berechnung von Umfang und Flächeninhalt gemacht. Es ließ sich ohne Probleme kompilieren. Anschließend habe ich die beiden Methoden, die ich ausgelassen habe noch eingebaut, ging immer noch. Nun in der Methode die mir Sorgen bereitet hat noch ne Ausgabe eingefügt damit ich mir sicher sein kann. Und ja es geht.

    Ich habe echt keine Ahnung wie ich das hingekriegt haben könnte o.O

    Trotzdem danke an alle die mir geholfen haben.



  • Manchmal kommt es vor, dass Objektdateien nicht korrekt mit neuen ersetzt werden und dann können solche Fehler vorkommen. Im Zweifelsfall eben Projekt komplett bereinigen (alle Objektdateien löschen) und dann neu erstellen. Dann sind solche Fehler eben weg.



  • Ja, oder einfach "Alles neu erstellen", das kombiniert Bereinigen und Erstellen soweit ich weiß.


Anmelden zum Antworten