PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADT- Neue Standards oder mache ich was falsch?



RAHUL
16-11-2005, 14:01
Hallo,

Ich lerne gerade ein wenig C++ als Programmieranfänger aus diesem teilweise guten, teilweise schlechten Buch "C++ in 21 Tagen" von Jesse Liberty(ältere Ausgabe von 99).
Ich bin jetzt gerade bei Abstrakten Datentypen. Erst habe ich Bsp 13.7 mit
4 Klassen(cShape, cCircle, cRectangle, cSquare) erstellt und kompiliert. Hat auch geklappt.
In dem Beispiel ist cShape so deklariert:


class cShape
{
public:
cShape() {}
virtual ~cShape () {}
virtual long GetArea() const {return -1;}
virtual long GetPerim() const {return -1;}
virtual void Draw() {}
protected:
};


In Bsp. 13.8 soll die drei Methoden aber durch ADTs ersetzt werden. Aber sonst bleibe der ganze Code derselbe.



class cShape
{
public:
cShape() {}
virtual ~cShape () {}
virtual long GetArea() = 0;
virtual long GetPerim() = 0;
virtual void Draw() = 0;
private:
};


Ich bekomme dann aber den Fehler vom Compiler:
Listing_13_08.cpp:106: Fehler: es kann kein Objekt des Typs »cCircle« belegt wer den
Listing_13_08.cpp:106: Fehler: denn die folgenden virtuellen Funktionen sind a bstrakt:
Listing_13_08.cpp:14: Fehler: virtual long int cShape::GetArea()
Listing_13_08.cpp:15: Fehler: virtual long int cShape::GetPerim()
,
genauso für cRectangle und cSquare.

Muss man da noch etwas beachten, habe ich etwas übersehen oder ist irgendetwas
neu hinzugekommen, was es zu berücksichtigen gilt??

Danke

peschmae
16-11-2005, 16:27
Ich sehe nicht was da nicht funktionieren sollte. Du hast an den anderen Klassen nichts geändert? Hast du eine der abstrakten Methoden zu überschreiben vergessen?

Hast du mal ein kompilierbares Minimalbeispiel mit dem Fehler? Oder zumindest die Zeile wo der Fehler auftritt.

MfG Peschmä

RAHUL
16-11-2005, 17:23
Hallo Peschmae,

ob das als Minimalbeispiel durchgeht, aber ich habe mal nur cCircle mitreingenommen.
Und den Rest auskommentiert. Der Compiler-Fehler ist geblieben.


#include <iostream>
using namespace std;


class cShape
{
public:
cShape() {}
virtual ~cShape () {}
virtual long GetArea() = 0;
virtual long GetPerim() = 0;
virtual void Draw() = 0;
private:
};


class cCircle: public cShape
{
public:
cCircle (int radius):itsRadius(radius) {}
~cCircle () {}
long GetArea() const {return 3*itsRadius*itsRadius;}
long GetPerim() const {return 6*itsRadius;}
void Draw();
private:
int itsRadius;
int itsCircumference;
};


void cCircle::Draw()
{
cout << "Routine zum Zeichnen eines Kreises!\n";
}

int main()
{
int choice;
bool fQuit = false;
cShape * sp;

while (! fQuit)
{
cout << "(1)Kreis\n(0)Beenden\n>: ";
cin >> choice;

switch (choice)
{
case 0:
fQuit = true;
break;
case 1:
sp = new cCircle(5);
break;
default:
cout << "Nur 0 oder 1 eingeben" << endl;
continue;
break;
}

if (! fQuit)
{
sp->Draw();
delete sp;
}
cout << endl;
}

return 0;
}

Kann es vielleicht etwas damit zu tun haben, dass
ich die Methoden inline definiert habe, denn für Draw ist, die Fehlermeldung nicht angezeigt...
Probier ich aus und sag Bescheid, ob es klappt

anda_skoa
16-11-2005, 17:46
Die Signaturen von GetArea und GetPerim stimmen nicht überein.

In der Basisklasse sind sie ohne const, in den Implementationen mit const.
Das sind aus Sicht des C++ Compilers zwei ganz andere Methoden.

Ciao,
_

pucki
16-11-2005, 17:52
hi,

sobald du eine methode als rein virtuell deklarierst, musst du in den abgeleiteten klassen diese implementieren, sonst murrt der compiler zurecht ....


virtuell:

virtuell xcvv();

rein virtuell:
virtuell xxds()=0;


gruesse reinhard

RAHUL
16-11-2005, 17:53
Jo,
Danke schön

das war es natürlich