Class Problem



  • Hallo,
    ich habe die aufgabe eine class zu schreiben für einen Kreis und prorgamm geschrieben, aber es funktioniert mal wieder nicht und ich muss dass teil morgen früh abgeben.

    #include <iostream>
    using namespace std;
    // circle class declaration
    class circle
    {
          private:
                  double diameter;
                  double area;
                  double perimeter;
          public:
                 circle ();
                 double PI = 3.14159;
                 double radius;
                 void setradius (double);
                 void setdiameter (double);
                 void setarea (double);
                 void setperimeter (double);
                 double getradius () const;
                 double getarea () const;
                 double getdiameter () const;
                 double getperimeter ()const;
                 };
    
          void circle:: setradius (double rad)
          { 
               radius = rad;
          }
    
          void circle:: setdiamter (double dia)
          {
               diameter = dia;
               }
    
          void circle:: setarea (double are)
          {
               area = are;
               }
    
          void circle:: setperimeter (double per)
          {
               perimeter = per;
               }
    
          double circle:: getradius () const
          {
                 return radius;
                 }
    
          double circle:: getarea () const
          {
                 return area = radius * radius * PI;
                 }
          double circle:: getdiameter () const
          {
                 return diameter = 2 * radius();
                 }
          double circle:: getperimeter () const
          {
                 return perimeter = 2* radius * PI;
                 }
    
    int main ()
    {
        circle box;
        double radi;
    
        cout << "This programm calculates the area, perimter, diamter of a circle\n"
        cout << "Enter the radius of the circle. If you only know the diamter. Divided the diameter by 2 before entering \n"
        cin >> radi;
        box.setradius (radi);
    
        cout << "Here are the circle's data.\n";
        cout << "Radius:: " box.getradius()<< endl;
        cout << "Area:: " box.getarea()<< endl;
        cout << "Diameter::" box.getdiameter() << endl;
        cout << "Perimeter ::" box.getperimeter() << endl;
        return 0;
    }
    

    Hier mein Compiler LOG

    12 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp ISO C++ forbids initialization of member PI' 12 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp makingPI' static
    12 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp ISO C++ forbids in-class initialization of non-const static member PI' 30 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp no \void circle::setdiamter(double)' member function declared in class `circle'
    C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp In member function double circle::getarea() const': 51 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp assignment of data-membercircle::area' in read-only structure
    C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp In member function double circle::getdiameter() const': 55 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp((const circle*)this)->circle::radius' cannot be used as a function
    C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp In member function double circle::getperimeter() const': 59 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp assignment of data-membercircle::perimeter' in read-only structure
    C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp In function int main()': 68 C:\\Dokumente und Einstellungen\\Amilo\\Eigene Dateien\\C++\\kreis.cpp expected;' before "cout"

    vIELEN vielen dank ich bin wirklich am verzweifeln!
    Julia



  • Also gleich einige Anmerkungen zu deinem Verhalten.

    Erstens ist es nicht unbedingt die feine Art, seinen Thread als "dringend" einzustufen in der Hoffnung, er erhält so tatsächlich mehr Priorität. Wir behandeln solche Threads nicht bevorzugt. Im Übrigen ist es sehrwahrscheinlich selbstverschuldet, dass du mit der Zeit so knapp dran bist.

    Zweitens gibt es sogenannte Fehlermeldungen. Diese kann man lesen, in den meisten Fällen geben sie sehr gut Auskunft über den Fehler. Wie zum Beispiel hier.

    Du kannst Klassenmember nicht bei deren Deklaration initialisieren (Ausnahme: statisch konstante integrale Variablen). Tu das in der Initialisierungsliste des Konstruktors.



  • ok sorry aber ich muss sagen ich verstehe von der ganzen sache nur bahnhof und was ist die initialisierungs liste des constructors?



  • Desweiteren hast du, Playmuckel, dich zum einen hier offenbar verschrieben:

    void setdiameter (double); // Deklaration
    void circle:: setdiamter (double dia) // Definition
    

    Und wieso du innerhalb der folgenden konstanten Elementfunktionen versuchst Datenelemente deiner Klasse zu verändern erschließt sich mir leider nicht so ganz...

    double circle:: getarea () const 
    { 
        return area = radius * radius * PI; 
    } 
    double circle:: getdiameter () const 
    { 
        return diameter = 2 * radius(); 
    } 
    double circle:: getperimeter () const 
    { 
        return perimeter = 2* radius * PI; 
    }
    

    Edit: Was ich noch vergessen habe:

    cout << "This programm calculates the area, perimter, diamter of a circle\n" 
    cout << "Enter the radius of the circle. If you only know the diamter. Divided the diameter by 2 before entering \n"
    

    Da fehlen noch die Semikolons.



  • also soll ich die const entfernen. Ich gebe zu des ganze c++ ist ein buch mit sieben siegeln für mich und ich muss leider einen kurs machen für meine ausbildung, aber alles lernen hilft nicht wirklich. und was ist jetzt genau der unterschied zwischen deklartion und defenition?



  • Ja, zum einen das const solltest du dann schon weglassen. Das mit Definition und Deklaration war wohl etwas verwirrend von mir beschrieben. Mir ging es eher um den Namen der Elementfunktion setdiameter . Bei der Definition dieser Elementfunktion hast du statt setdiameter nämlich setdiamter geschrieben, also hast du das 'e' im Namen der Elementfunktion vergessen.



  • danke ich habe die const weg gemacht und auch den diameter ausgebessert.
    was heißt diese fehlermeldung genau?
    12 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp ISO C++ forbids initialization of member `PI'



  • Playmuckel schrieb:

    ok sorry aber ich muss sagen ich verstehe von der ganzen sache nur bahnhof und was ist die initialisierungs liste des constructors?

    Also, ich erklär es dir kurz:
    Konstruktoren sind Funktionen, die eine Instanz der Klasse erstellen und normalerweise die Aufgabe haben, deren Member zu initialisieren. Dabei schreibt man die einzelnen Membernamen nach einem Doppelpunkt und trennt sie mit Kommas. In den Klammern stehen die Werte, mit denen die Membervariablen initialisiert werden.

    Du hast zum Beispiel eine Klasse MyClass mit zwei double -Membern Mem und Var . Dann kannst du im Standardkonstruktor folgendes schreiben:

    MyClass::MyClass() : Mem(3.5), Var(5.66)
    {
    
    }
    

    In einem anderen Konstruktor könntest du die Member gleich mit den übergebenen Argumenten initialisieren:

    MyClass::MyClass(double NewMem, double NewVar = 10.8) : Mem(NewMem), Var(NewVar)
    {
    
    }
    

    Bei elementaren Typen wie int , double etc. und Zeigern findet keine Initialisierung statt, wenn man dies nicht explizit tut. Bei PODs auch nicht. Bei Klassentypen wird der Standardkonstruktor aufgerufen.

    Playmuckel schrieb:

    ich muss leider einen kurs machen für meine ausbildung, aber alles lernen hilft nicht wirklich.

    Ich fürchte aber, da wirst du, vor allem langfristig, nicht darum herum kommen. Klar brauchst du nicht alles zu wissen, aber Klassen - und insbesondere auch Konstruktoren, sind schon sehr essenziell.

    Playmuckel schrieb:

    was heißt diese fehlermeldung genau?
    12 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp ISO C++ forbids initialization of member `PI'

    Das hab ich bereits in meinem oberen Post erwähnt. Bitte lies meine Antworten.



  • ich weiß ihr gebt euch wanhsinnig viel mühe und opfert zeit, aber ich verstehe es immer noch nicht was ich dabei falsch mache und des andere ist folgende fehlermeldung: 75 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp expected `;' before "box" und ich habe des so im unterricht gelernt weiß aber gerade nicht was falsch ist.



  • Playmuckel schrieb:

    75 C:\Dokumente und Einstellungen\Amilo\Eigene Dateien\C++\kreis.cpp expected `;' before "box"

    Hier:

    cout << "Radius:: " box.getradius()<< endl; 
    cout << "Area:: " box.getarea()<< endl; 
    cout << "Diameter::" box.getdiameter() << endl; 
    cout << "Perimeter ::" box.getperimeter() << endl;
    

    Hast du ein paar << (= Ausgabeoperator) vergessen:

    cout << "Radius:: " << box.getradius()<< endl; 
    cout << "Area:: " << box.getarea()<< endl; 
    cout << "Diameter::" << box.getdiameter() << endl; 
    cout << "Perimeter ::" << box.getperimeter() << endl;
    


  • Ok vielen dank



  • Playmuckel schrieb:

    ich weiß ihr gebt euch wanhsinnig viel mühe und opfert zeit

    Nun ja, "wahnsinnig" ist vielleicht etwas übertrieben, aber ich bin froh, wenn du das schätzt.

    Ich kann dir nur empfehlen, unsere Antworten zu lesen, bis du verstanden hast, worum es geht und was denn der Fehler war. Es ist auch überhaupt kein Problem, bei Unklarheiten nochmals nachzufragen.



  • also sollte ich PI definieren
    circle:: circle (PI = 3,17)
    Mich verwirrt des ganze total.



  • ok des mit Pi habe ich hinbekommen, aber jetzt sind es noch zwei kleinigkeiten mit denen ich mal gar nix anfangen kann.
    C:\DOKUME1\Amilo\LOKALE1\Temp\cceybaaa.o(.text+0x1c7) In function main': [Linker error] undefined reference tocircle::circle()'
    C:\DOKUME1\Amilo\LOKALE1\Temp\cceybaaa.o(.text+0x1c7) ld returned 1 exit status



  • Du hast den Standardkonstruktor circle::circle() zwar in der Klasse deklariert, aber nirgends definiert. Die Definition könnte etwa so aussehen:

    circle::circle() : PI(3.1415)
    {
    
    }
    

    Die anderen Membervariablen kannst du auch in der Initialisierungsliste initialisieren (z.B. nach PI , mit Komma getrennt).


Anmelden zum Antworten