Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Fehlersuche Vererbung CodeBlocks

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.01.2018, 14:13 Uhr
SaBit



Hallo, ich finde meinen Fehler nicht. Ich arbeite mit CodeBlocks und bekomme folgende Fehlermeldung:

-------------- Build: Debug in NewYear (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions -g -I -c /home/dabinigg/Informatik/NewYear/Kreis.cpp -o obj/Debug/Kreis.o
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In Funktion `_start':
(.text+0x20): Nicht definierter Verweis auf `main'
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

jetzt weiss ich nicht ob ich einen Fehler im Programm habe, oder mal wieder Einstellungen bei CodeBlocks nicht beachtet habe. Hier ist mein Code:


C++:
//main.cpp

#include <iostream>
#include "Kreis.h"
#include "Zylinder.h"

using namespace std;

int main()
{
    Kreis K1;
    K1.Radius=2.0;
    K1.PI=3.16;
    Zylinder Z1;
    Z1.Radius=3.0;
    Z1.PI=3.16;
    Z1.Hoehe=4.0;

    K1.BerechneKreisFlaeche();
    K1.BerechneKreisUmfang();

    Z1.BerechneKreisFlaeche();
    Z1.BerechneKreisUmfang();
    Z1.BerechneZylinderFlaeche();
    Z1.BerechneZylinderVolumen();

    cout <<"K1:: Flaeche " K1.Flaeche << " Umfang " << K1.Umfang << endl;
    cout <<"Z1:: KreisFlaeche " << Z1.Flaeche << " KreisUmfang " << Z1.Umfang <<
    " Zylinderflaeche " << Z1.FlaecheZylinder << " Zylindervolumen " << Z1.VolumenZylinder
    << endl;

    return 0;
}

//Kreis.h

#ifndef KREIS_H
#define KREIS_H


class Kreis
{
    public:
        Kreis();
        double Radius;
        double PI;
        void BerechneKreisFlaeche();
        void BerechneKreisUmfang();
        double Flaeche;
        double Umfang;
};

#endif // KREIS_H

//Kreis.cpp

#include <math.h>

Kreis::Kreis(){
    PI=3.16;
    Flaeche=0.0;
    Umfang=0.0;
}

void Kreis::BerechneKreisFlaeche(){
    Flaeche=pow(Radius,2.0)*PI;
}

void Kreis::BerechneKreisUmfang(){
    Umfang=Radius*2.0*PI;
}

//Zylinder.h

#ifndef ZYLINDER_H
#define ZYLINDER_H


class Zylinder : public Kreis
{
    public:
    double Hoehe;
    void BerechneZylinderFlaeche();
    void BerechneZylinderVolumen();
    double FlaecheZylinder;
    double VolumenZylinder;
};

#endif

//Zylinder.h

#include "Zylinder.h"
#include <math.h>

Zylinder::Zylinder(){
    FlaecheZylinder=0.0;
    VolumenZylinder=0.0;
}

void Zylinder::BerechneZylinderFlaeche(){
    FlaecheZyliner=((pow(Radius,2.0)*PI)*2.0)+(Hoehe*Radius*2.0*PI);
}

void Zylinder::BerechneZylinderVolumen(){
    VolumenZyliner=(pow(Radius,2.0)*PI)*Hoehe);
}




ich hab gerade schon beim kopieren gemerkt, dass einige Fehler noch mit drinnen sind. Also liegt wohl ein Fehler bei den Einstellungen mit den Klassen und Methoden vor. Ich werde versuchen ein neues Konsolenprogramm zu machen, in den ich den Quelltext nocheinmal hineinkopiere.

Danke schonmal für Tipps die helfen können.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.01.2018, 21:57 Uhr
ao

(Operator)


Sieht so aus, als ob die main.cpp im Projekt fehlt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.01.2018, 09:32 Uhr
ao

(Operator)


Ich habe das Programm lauffähig gemacht und folgende Ausgaben bekommen:

Code:
$ ./kreis
K1:: Flaeche 12.64 Umfang 12.64
Z1:: KreisFlaeche 28.44 KreisUmfang 18.96 Zylinderflaeche 132.72 Zylindervolumen 113.76


Kann das stimmen?

Zu deinem Klassendesign:

C++:
class Kreis
{
    public:
        Kreis();
        double Radius;
        double PI;
        void BerechneKreisFlaeche();
        void BerechneKreisUmfang();
        double Flaeche;
        double Umfang;
};


1. Es ist sehr ungewöhnlich, Variablen wie Radius, Flaeche, Umfang public zu machen, weil man dadurch jegliche Kontrolle verliert, wer von außen auf das Kreis-Objekt zugreift und seine Eigenschaften ausliest und verändert. Manchmal gibt es Gründe dafür, aber für Anfänger gilt die Regel: Membervariablen sollen grundsätzlich private oder protected, d.h. von außen nicht erreichbar sein.

2. Das führt zu der Frage, wie man denn Berechnungsergebnisse (Fläche, Umfang) abholen kann. Antwort: Indem man schreibt: double BerechneKreisFlaeche(); Dadurch bekommt die Funktion einen Rückgabewert (Typ double), in dem man den Flächeninhalt nach außen geben kann.

Dasselbe gilt natürlich auch für Zylinder.

3. Pi ist keine Eigenschaft des Kreises. Es sollte deshalb auch kein Member von Kreis sein.

4. Die Ableitung class Zylinder : public Kreis möchte ich in Frage stellen. Mit dieser Beziehung behauptest du "ein Zylinder ist ein Kreis", und das ist so nicht wahr, schon weil die Flächen-Eigenschaft ganz anders verstanden wird. Die Konsequenzen davon hast du schon gespürt, als du unterscheiden musstest zwischen BerechneKreisFlaeche und BerechneZylinderFlaeche. Und derartige Probleme werden größer, wenn die Klassenentwürfe größer werden.

Grundsätzlich muss man Ableitungsbeziehungen sehr sorgfältig definieren und genau prüfen, ob es sich wirklich um eine "ist ein"-Beziehung handelt.

Ein besserer Ansatz ist meiner Meinung nach: "Ein Zylinder hat einen Kreis", was ausgedrückt wird durch eine Member-Beziehung:

C++:
#include "kreis.h"
class Zylinder {
    
    Kreis grundflaeche;
};


Damit sind der Zylinder und seine Grundfläche immer noch verschiedene Objekte mit verschiedenen Eigenschaften, trotzdem gibt es keinen Zylinder ohne kreisförmige Grundfläche, und über geeignete Methoden kann man auch auf die Grundflächen-Eigenschaften zugreifen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.01.2018, 16:28 Uhr
SaBit



@ao danke für die lange Antwort.

FH 1. Semester. Da haben wir bist jetzt mit private noch garnichts gemacht. In dem Buch das ich gerade lese: Schrödinger programmiert wird das auch von vorne ab auseinandergehalten.

es lag wohl an einer einstellung in codeblocks selbst.

ok, das heisst es ist sinnvoller eine klasse innerhalb einer klasse zu bestimmen.
ich hab nur ein beispiel für eine vererbung gebraucht und deshalb mir das programm ausgedacht . nur hat das eben nicht geklappt, obwohl ich eigentlich nur die zeile

class Zylinder : public Kreis

austesten wollte.

danke, thema ist für mich erledigt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: