Schwierigkeiten mit virtuellen Funktion



  • Halli Hallo,

    wie der Titel schon sagt, habe ich ein Problem mit den virtuellen Funktionen.

    Ich versuch das mal in Code zuschreiben, denke, da kann man das am besten nachvollziehen.

    class MappingFactoryBase
    {
    public:
        static void CreateMapping();
    protected:
        virtual std::string GetRootName(void)=0;
        virtual std::string GetRecordName(void)=0;
    }
    
    MappingFactoryBase::CreateMapping()
    {
        GetRootName();
        GetRecordName();    
    }
    
    class MappingFactory002 : MappingFactoryBase
    {
    protected:
        virtual std::string GetRootName(void);
        virtual std::string GetRecordName(void);
    
    }
    
    std::string MappingFactory002::GetRootName()
    {
        return "RecordSet002";
    }
    
    std::string MappingFactory002::GetRecordName()
    {
        return "002";
    }
    
    class Adresse002
    {
    public:
        Adresse002(std:.string);
    
    friend MappingFactory002;
    }
    
    Adresse002::Adresse002("Hallo")
    {
        MappingFactory002::CreateMapping();
    }
    

    Hm, ich versuch es auch noch einmal in Worte zufassen.

    Also ich habe ein Adressenobjekt, welches beim instanzieren die Methode CreateMapping von MappingFactory002 aufrufen soll. Innerhalb dieser Methode sollen die beiden überladenen Funktionen aufgerufen werden, welche in MappingFactory002 implementiert sind.

    Leider bekomme ich immer die Fehlermeldung:
    "Illegal call of non-static member function". Tja und der Vorschlag von MS Visual Studio .NET 2003, ein static davor zuschreiben hilft ja auch nicht, denn sie soll ja nun mal virtuell sein. Es gibt nämlich noch weitere Adresse und MappingFactory - Klassen, die diese Methode auch überladen.

    Ich hoffe, jemand versteht die Problematik und kann mir weiterhelfen.

    Danke schon mal jetzt.

    Liebe Grüße

    Rike



  • Aus einer static Methode kannst du keine nicht-static Methoden aufrufen und auch auf keine nicht-static Membervariablen zugreifen, weil static Methoden keinen this-Zeiger bekommen können, da sie zur Klasse und nicht zu einer Instanz gehören. Lass doch das static weg 😕



  • D@niel $chumann schrieb:

    Aus einer static Methode kannst du keine nicht-static Methoden aufrufen und auch auf keine nicht-static Membervariablen zugreifen, weil static Methoden keinen this-Zeiger bekommen können, da sie zur Klasse und nicht zu einer Instanz gehören. Lass doch das static weg 😕

    Nachdem ich nun auch das versucht habe, bekomme ich nun die erneut die Fehlermeldung, allerdings bezieht sie sich nun direkt auf die Create - Methode und nicht wie vorher, auf GetRootName bzw. GetRecordName.

    Gibts es noch andere Möglichkeiten auf diese Methoden zuzugreifen?

    Ich bin echt ratlos, hab schon einiges probiert, aber komme nicht weiter.

    Liebe Grüße

    Rike



  • Für dein konkretes Problem gibt es keine Lösung, weil dahinter ein Verständnisproblem liegt. Du solltest dir erstmal darüber klar werden, was der Unterschied zwischen statischen und nicht-statischen Memberfunktionen ist. Weiterhin darüber, was du eigentlich machen willst. Es hilft nicht, wenn du jetzt mit Gewalt dein Design so hinbiegst, dass der Compiler es akzeptiert.



  • Entweder oder:

    Du willst je nach Objekt-Typ andere Methoden aufrufen. Dann
    musst du aber wenigstens ein Objekt erzeugen.

    Oder die Methoden sollen alle gleich sein, dann mach alle static.

    Jockel



  • Das Problem ist, dass das Design zum Großteil bereits vorliegt (Extern Programmiert wurde) und es bis auf das Adressenobjekt kein anderes angelegt wird. Und beim Anlegen des Adressobjektes soll die CreateFunktion aufgerufen werden, welche dann verschiedenste Daten verarbeitet. Da diese aber von Adresse002, Adresse003, ... unterschiedlich sind, gibt es für diese die virtuellen Funktionen GetRootName und GetRecordName die dann innerhalb der CreateMethode aufgerufen werden müssen für das jeweilige Objekt. Wollte ja eigentlich eine Basisklasse für die AdressObjekte anlegen und der CreateMethode dann dieses Objekt mitübergeben, welche dann die Funktionen GetRootName und GetRecordName bereitstellt, aber das wurde abgelehnt. Warum weiß ich nicht wirklich, bin ja auch nicht so fit in C++, aber naja irgendwie muß ich nun eine Lösung finden.

    Trotzdem Danke an alle

    LG

    Rike


Anmelden zum Antworten