cannot declare variable to be abstract type

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
rattertattermaschine
Beiträge: 13
Registriert: Mo Mai 17, 2010 9:41 pm

cannot declare variable to be abstract type

Beitrag von rattertattermaschine » Mo Mai 17, 2010 9:54 pm

Hallo,

Ich bin ein neuling in Sachen c++ und komme durch eine Fehlermeldung nicht weiter. :?
die Fehlermeldung heißt : cannot declare variable to be abstract type
Diese Fehlermeldung taucht 9 mal auf ,da ich 9 objekte erzeugt habe.

Die erste und Gleichzeitig Basisklasse ist Flaeche von der leite ich Ring,kreis,schablone,Rechteck,und Quadrat.
Dannach rechne ich von jedem Objekt den Umfang und die Fläche.
main.cpp

Code: Alles auswählen

#include <iostream>

using namespace std;
#include "beispiel51.h"
#include "beispiel52.h"
#include "beispiel53.h"
#include "beispiel54.h"
#include "beispiel55.h"
#include "beispiel60.h"

int main(){
    Flaeche *liste[9];
    int index = 0;
    float sum_Umfang = 0;
    Ring blau_ring("BLAU",5,2);
    Kreis gelb_kreis("GELB",7);
    Rechteck gruen_rechteck("GRUEN",5,6);
    Kreis rot_kreis("ROT",8);
    Schablone weiss_schablone("WEISS",20,6,3);
    Rechteck schwarz_recheck("SCHWARZ",10,20);
    Schablone blau_schablone("BLAU",30,5,5);
    Ring lila_ring("LILA",100,5);
    Quadrat rosa_q("ROSA",5);
    liste[0] = &blau_ring;
    liste[1] = &gelb_kreis;
    liste[2] = &gruen_rechteck;
    liste[3] = &rot_kreis;
    liste[4] = &weiss_schablone;
    liste[5] = &schwarz_recheck;
    liste[6] = &blau_schablone;
    liste[7] = &lila_ring;
    liste[8] = &rosa_q;

    while (index <= 8){
        (liste[index])->getFarbe();
        sum_Umfang += (liste[index++])->berechneUmfang();
    }

    cout << "\nDie Gesamtflaeche betreagt "
        << sum_Umfang<< "Einheiten";

        return 0;
}

Ich zeige nur eine .h und .cpp Dateien weil es eigentlich immer, der gleiche Fehler ist.

Code: Alles auswählen

/ bspl0053.h
#ifndef _RING_
#define _RING_
#include "beispiel52.h"

class Ring : public Kreis
{
public:
    Ring(char *n, float aussen, float innen);
    ~Ring();
    float berechneFlaeche() const;
    int berechneUmfang(float dd2,float ppi = 3.14);
private:
    float innenradius;
};

#endif

Code: Alles auswählen

/ bspl0053.cpp
#include "beispiel53.h"

Ring::Ring(char *n, float aussen, float innen)
        :Flaeche(n),Kreis(n, aussen)
{
    innenradius=innen;
}

int Ring::berechneUmfang(float dd2,float ppi ){
    dd2*=ppi;
    umfang = dd2;
    return umfang;
}

Ring::~Ring()
{
}

float Ring::berechneFlaeche() const
{
    return (Kreis::berechneFlaeche()-
            (innenradius*innenradius*3.141593F));
}
Bitte um hilfe und danke im voraus

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: cannot declare variable to be abstract type

Beitrag von Kerli » Mo Mai 17, 2010 10:26 pm

Hallo, willkommen im Forum.

Deine Fehlermeldung bedeutet, dass du versuchst eine Instanz eines abstrakten Objektes anzulegen. Ein Objekt ist dann abstrakt wenn es mindestens eine abstrakte Methode hat, die in der gesamten Ableitungshierarchie nicht implementiert worden ist. Aus dem Grund wäre es noch vor allem interessant wie deine Klassen Fläche und Kreis ausschauen.

Da ich aber das Buch, aus dem du diesen Code hast ebenfalls besitze, würde ich darauf tippen das bei 'berechneUmfang' der Rückgabewert vom Typ 'float' sein sollte, so dass die abstrakte Funktion aus der Basisklasse implementiert wird und nicht durch eine Version mit anderem Rückgabetyp versteckt wird.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: cannot declare variable to be abstract type

Beitrag von stampuhh » Mo Mai 17, 2010 10:29 pm

Hey,

ich habe das selbe Buch hier liegen in dem das steht. Unter dem Beispiel steht noch es muss etwas in der bspl0051.h eingefügt werden.

Code: Alles auswählen

virtual float berechneFlaeche() const = 0;
hast du das schon gemacht? Ansonsten kann ich leider auch nicht helfen. Ich lerne auch noch ;)

gruß stampuhh
NachDenkSeiten.de

rattertattermaschine
Beiträge: 13
Registriert: Mo Mai 17, 2010 9:41 pm

Re: cannot declare variable to be abstract type

Beitrag von rattertattermaschine » Mo Mai 17, 2010 10:37 pm

Also die klasse Kreis sieht so aus:

.h

Code: Alles auswählen

#ifndef _KREIS_
#define _KREIS_
#include "beispiel51.h"

class Kreis : public virtual Flaeche
{
public:
    Kreis(char *n, float a);
    ~Kreis();
    float berechneFlaeche() const;
    float berechneUmfang(float d2,float pi = 3.14);
private:
    float radius;
protected:
    float umfang;
};

#endif
.cpp

Code: Alles auswählen

#include "beispiel52.h"

Kreis::Kreis(char *n, float a) : Flaeche(n)
{
    radius=a;
}

Kreis::~Kreis()
{
}

float Kreis::berechneUmfang(float d2,float pi )
{
    d2*=pi;
    umfang = d2;
    return umfang;

}


float Kreis::berechneFlaeche() const
{
    return radius*radius*3.141593F;
}
Hier Fläche klasse:

.h

Code: Alles auswählen

// bspl0051.h
#ifndef _FLAECHE_
#define _FLAECHE_
#include <iostream>

class Flaeche
{
public:
    Flaeche(char *n);
    ~Flaeche();
    void getFarbe() const;
    virtual float berechneFlaeche() const = 0;
    virtual float berechneUmfang() const = 0;
private:
    char farbe[11];
};
#endif
.cpp

Code: Alles auswählen

/ bspl0051.cpp
#include <iostream>
#include <cstring>
#include "beispiel51.h"
using namespace std;

Flaeche::Flaeche(char *n)
{
    strncpy(farbe,n,10);
}


Flaeche::~Flaeche()
{
}

void Flaeche::getFarbe() const
{
    cout << "\n" << farbe;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: cannot declare variable to be abstract type

Beitrag von Xin » Mo Mai 17, 2010 10:46 pm

rattertattermaschine hat geschrieben:Hallo,
Bei dem Namen, der mir nichtmals bekannt war, und einem englischen Titel hatte ich Dich schon auf aufgerufen, um Dich und das Posting zu löschen. ^^

Nur das "Wort" vairable kam mir irgendwie komisch vor, sonst steht da doch Viagra bei den englischen Posts...!? ;-)
rattertattermaschine hat geschrieben:Ich bin ein neuling in Sachen c++ und komme durch eine Fehlermeldung nicht weiter. :?
die Fehlermeldung heißt : cannot declare variable to be abstract type
Diese Fehlermeldung taucht 9 mal auf ,da ich 9 objekte erzeugt habe.

Die erste und Gleichzeitig Basisklasse ist Flaeche von der leite ich Ring,kreis,schablone,Rechteck,und Quadrat.
Dannach rechne ich von jedem Objekt den Umfang und die Fläche.
Erstmal Hallo erstmal.

Die Fehlermeldung sagt aus, dass Du eine abstrakte Methode hast, die Du nicht implementierst. Weil es damit eine Methode gibt, die man aufrufen könnte, weil sie im Basisobjekt deklariert ist, aber die im eigentlichen Objekt nicht definiert ist, weil sie nie implementiert wurde.
Funktionen, die mit =0 enden, müssen mit identischem Rückgabetyp und identischen Parametern implementiert werden, sonst bleibt die Methode abstrakt und ein Objekt, dass Methoden besitzt, die nicht existieren, darf man nicht erzeugen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: cannot declare variable to be abstract type

Beitrag von Kerli » Mo Mai 17, 2010 10:48 pm

Schau dir auch einmal genauer die Fehlermeldung des Compilers an. Normalerweise sagt er eh welche Methode abstrakt ist (zb "because the following virtual functions are pure within <Klassenname> :" und in der nächsten Zeile die entsprechende Funktion).

Außerdem solltest du beachten das ein und die selbe Funktion sowohl in Header und Sourcefiles als auch in allen Klassen die selbe Signatur haben sollen (Signatur = Rückgabetyp + Parametertypen + Qualifier (zb. const)). Im Speziellen solltest du dir das einmal bei 'berechneUmfang' anschauen.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

rattertattermaschine
Beiträge: 13
Registriert: Mo Mai 17, 2010 9:41 pm

Re: cannot declare variable to be abstract type

Beitrag von rattertattermaschine » Di Mai 18, 2010 9:00 pm

gut dass noch 2 leute den buch haben anscheinend habe ich eine gute wahl getroffen. :P
Funktionen, die mit =0 enden, müssen mit identischem Rückgabetyp und identischen Parametern implementiert werden, sonst bleibt die Methode abstrakt
Oh wusste ich nicht,aber heute mal wieder was neues gelernt.

Außerdem solltest du beachten das ein und die selbe Funktion sowohl in Header und Sourcefiles als auch in allen Klassen die selbe Signatur haben sollen (Signatur = Rückgabetyp + Parametertypen + Qualifier (zb. const)). Im Speziellen solltest du dir das einmal bei 'berechneUmfang' anschauen.
Danke für den Hinweis habe auch inzwischen das problem gelöst. :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: cannot declare variable to be abstract type

Beitrag von Xin » Di Mai 18, 2010 9:21 pm

rattertattermaschine hat geschrieben:gut dass noch 2 leute den buch haben anscheinend habe ich eine gute wahl getroffen. :P
Ich habe keinen Plan, um welches Buch es geht, aber in den meisten C++ Büchern steht sowieso dasselbe drin - sonst wäre es ja kein C++-Buch ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten