Zum Inhalt springen

pure virtual function


T.Error

Empfohlene Beiträge

guten morgen zusammen

hab da ein kleines problem, welches ich nun verzweifelt seit geraumer zeit zu lösen versuche, aber bisher kläglich daran scheitere.

zum problem: in einer klasse, die auf einer basisklasse basiert, möchte ich den vergleichsoperator "==" überladen. der überladene operator soll aber auch als virtuelle funktion in der basisklasse existieren, damit er auch in anderen, von der basisklasse abgeleiteten klassen, nutzbar ist

wichtige ausschnitte aus der klassendefinition:


[LIT.h]

class LIT

{

 private:

        int Id;

        STRING Title;

 public:

        LIT();

        void setId(int num);

        void setTitle(const STRING& Str);

        void setTitle(const char* pStr);

        int getId();

        STRING& getTitle();

        virtual bool operator==(const LIT& other) =0;

};


[PERSON.h]

class PERSON : public LIT

{

 private:

        STRING Fname;

        STRING Lname;

 public:

        PERSON(int num);

        PERSON(int num, const char* title, const char* Pname, const char* Sname);

        PERSON(int num, const STRING& title, const STRING& Pname, const STRING& Sname);

        STRING& getFname();

        STRING& getLname();

        int getId();

        STRING& getTitle();

        bool operator==(const PERSON& other);

};


[PERSON.cpp]

bool PERSON::operator==(const PERSON& other)

{

 PERSON tmp(*this);

 return ((tmp.Fname==other.Fname) && (tmp.Lname==other.Lname));

}

das versuche ich dann mit einer kleinen mainfunktion zu testen:

int main()

{

 PERSON a(1, "user", "fname", "lname");

 PERSON b(2, "user", "fname", "lname");

 PERSON c(3, "in", "out", "done");


 if(a== cout<<"a==b\n";

 if(a==c) cout<<"a==c\n";


 return 0;

}

[/code]




der compiler wirft dann diese fehlermeldung raus:

[code] PERSON.cpp: In member function ‘bool PERSON::operator==(const PERSON&)’: PERSON.cpp:73: error: cannot declare variable ‘tmp’ to be of abstract type ‘PERSON’ PERSON.h:6: note: because the following virtual functions are pure within ‘PERSON’: LIT.h:19: note: virtual bool LIT::operator==(const LIT&) engine.cpp: In function ‘int main()’: engine.cpp:44: error: cannot declare variable ‘a’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions engine.cpp:45: error: cannot declare variable ‘b’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions engine.cpp:46: error: cannot declare variable ‘c’ to be of abstract type ‘PERSON’ PERSON.h:6: note: since type ‘PERSON’ has pure virtual functions

wenn ich den eintrag "virtual bool operator==(const LIT& other) =0;" aus der LIST.h entferne läuft das programm ohne zu murren. dem entnehme ich, dass der compiler ein problem mit der virtuellen funktion hat, wobei ich mir nicht erklären kann welches.

kann mich da jemand aufklären?

MfG

T.Error

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm...

virtual bool operator==(const LIT& other) =0;
Also erstens: pure gewollt? Zweitens: Die Klasse PERSON muss den abstrakten Operator überschreiben. Drittens:
operator==(const LIT& other)
und
operator==(const PERSON& other)

sind bei mir zwei Paar Schuhe.

[Editerle]

Ahh, Klotzkopp war schneller. :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

pure virtual war übrigens gewollt ...

Dann kannst du keine Reference const LIT& other als Parameter irgendwo übergeben.

Probiers mal mit Pointern.

Ansonsten würd ich den abstrakten Vergleichsoperator einfach weglassen und sicherstellen, dass jede Klasse an sich ihren Vergleichsoperator hat (welcher wieder nur mit dem Parametertyp der eigenen Klasse aufgerufen werden kann [hmm, das riecht nach generischer Klasse]).

Link zu diesem Kommentar
Auf anderen Seiten teilen

tjoa nach langem und nervtötendem rumprobiere möchte ich hier meinen fortschritt posten ... ich komm an selbem problem "mal wieder" nich weiter. hab, soweit es nötig war, alles auf pointer umgestellt, es lässt sich problemlos compilieren, nur passiert nicht das, wie es von mir beabsichtig ist.

die änderungen zum "original":


[LIT.h in pulbic]

virtual bool operator==(const LIT *other) =0;



[PERSON.cpp]

bool PERSON::operator==(const LIT* other)

{

 PERSON* tmp(this);

 PERSON* obj;

 obj=(PERSON*)other;


 return ((tmp->Fname==obj->Fname) && (tmp->Lname==obj->Lname));

}

interessant wäre da evtl auch ein paar ausschnitte aus der STRING-klasse:

class STRING

{

 private:

        int len;

        char* pBuf;

 public:

        STRING();

        STRING(const char* pStr);

        STRING(const STRING& other);

        STRING(char C, int n);

        ~STRING();

        int getLen();

        STRING& operator=(const STRING& other);

        STRING& operator=(const char* pStr);

        bool operator==(const STRING& other);

        friend ostream& operator<<(ostream& OS, const STRING& other)

        {

         OS<<other.pBuf;

         return OS;

        }

};



STRING& STRING::operator=(const STRING& other)

{

 len=other.len;

 pBuf=new char[len+1];

 strncpy(pBuf, other.pBuf, len);

 return *this;

}


STRING& STRING::operator=(const char* pStr)

{

 len=strlen(pStr);

 pBuf=new char[len+1];

 strncpy(pBuf, pStr, len);

 return *this;

}


bool STRING::operator==(const STRING& other)

{

 STRING tmp(*this);

 return !strcmp(tmp.pBuf, other.pBuf);

}

die dazugehörige main-funktion, um das zu testen lautet:

int main()

{

 PERSON* a;

 PERSON* b;

 PERSON* c;

 a=new PERSON(1, "user", "fname", "lname");

 b=new PERSON(2, "user", "fname", "lname");

 c=new PERSON(3, "in", "out", "done");


 if(a== cout<<"a==b\n";

 if(a==c) cout<<"a==c\n";


 return 0;

}

[/code]

die beiden if-abfragen werden beide als false interpretiert. nur weiß ich nicht warum ... irgendwo muss der fehler liegen.

wenn sich irgendwer dem ganzen wirrwar annehmen würde währ ich demjenigen äußerst dankbar ... aber warscheinlich seh ich mal weider den wld vor lauter bäumen nicht

grüße

technichal.error

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Umstellung auf Zeiger war ein Schritt in die falsche Richtung. Jetzt hast du einen Operator, der PERSON mit einem Zeiger auf LIT vergleichen kann. Du vergleichst aber zwei Zeiger, dafür hast du keinen Operator überladen, du kannst es auch gar nicht.

Ein weiteres Problem ist der Cast von other auf PERSON* in deinem Vergleichsoperator. Wenn der Parameter gar kein PERSON* ist (z.B. nur ein Zeiger auf ein LIT oder eine andere von LIT abgeleitete Klasse), dann hast du da undefiniertes Verhalten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...