Probleme mit einer Klasse...



  • statt

    #include <iostream>
    #include <"people.h">
    

    sollte es wohl

    #include "people.h"
    

    heissen.
    du brauchst auch einen konstruktor, denn die werte die du ausgeben willst sind nicht initialisiert also undefiniert.



  • danke erstmal!

    das war ein teil des problems... jetzt wird die header-datei eingefügt.

    aber nun gibt es fehler in der header-datei 😞

    16 expected constructor, destructor, or type conversion before '(' token
    16 expected ,' or;' before '(' token
    52 expected ;' before '(' token 58 expected;' before "int"
    58 expected ;' before '(' token 64 expected;' before "int"
    64 expected ;' before '(' token 76 expected;' before '}' token

    was is denn nu hier falsch?
    sorry wenn ich übrigens solche anfänger-fragen stelle, aber ich hab lang nicht mehr programmiert, und wollte es eigentlich mit diesem (meiner ansicht nach) relativ einfachen programm wieder lernen...

    mfg thomas



  • also:
    1.: du solltest srand() in der main aufrufen. oder wenigstens in irgenteine funktion stecken.
    2.: in deinen memberfunktionen fehlen in den parameterlisten die typen.
    3.: main sollte einen wert zurueckgeben. wenn du dies tust kannst du gleich exit(0) rausnehmen
    4.: mach besser <ctime> und <cstdlib> aus <time.h> und <cstdlib.h>
    5.: wie gesagt brauchst du noch einen konstruktor



  • sran() is jetzt in der main-funktion.
    main gibt jetzt 0 zurück ( return 0; )

    wieso <ctime> und <cstdlib> ? was is bei denen anders bzw. was für vorteile haben die?

    mim konstruktor hab ich noch probleme. hab ihn so eingetragen, wie es in meinem einen c++ buch steht, aber es kommt der gleiche fehler... hab nach "public:"
    Musician(); und dann ~Musician(); geschrieben, aber nichts!
    habs auch schon außerhalb der klasse gehabt... auch mit Musician::Musician() und Musician::~Musician()

    aber es hat nicht funktioniert.

    dennoch danke bisher für eure hilfe 🙂

    mfg thomas



  • ne andere frage:
    funktioniert es überhaupt, dass bei jedem neuen objekt der klasse neue werte für geburtsjahr/-monat/-tag erstellt werden? oder muss ich da die "zufalls-funktionen" wo anderst schreiben?

    mfg thomas



  • Dauermuede schrieb:

    wieso <ctime> und <cstdlib> ? was is bei denen anders bzw. was für vorteile haben die?

    keine.

    den destruktor brauchst du eigentlich nicht zu definieren, da wird wohl der default ausreichen. beim konstruktor solltest du eigentlich nur alle variablen initialisieren-aber das sollte eigentlich nicht so das problem sein.

    poste am besten nochmal deinen ueberholten kompletten code.

    Dauermuede schrieb:

    funktioniert es überhaupt, dass bei jedem neuen objekt der klasse neue werte für geburtsjahr/-monat/-tag erstellt werden? oder muss ich da die "zufalls-funktionen" wo anderst schreiben?

    ja das funktioniert. dazu musst du aber die werte mit der zufallsfunktion im konstruktor initialisieren denn der wird bei jedem neuem objekt aufgerufen.



  • main.cpp

    #include "people.h"
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        int i;
    
        Musician One;
        Musician Two;
    
        cout << "Geburtsjahr Musiker 1: " << One.b_year << endl;
        cout << "Geburtsjahr Musiker 2: " << Two.b_year << endl;
        cin >> i;
    
        return 0;
    }
    

    people.h

    #include <time.h> // fuer time
    #include <stdlib.h> // fuer srand
    #include <iostream> // fuer cout
    
    using namespace std;
    
    class Musician
    {
        public:
        Musician();                     // wie in meinem C++ Buch
    
        char Name;
        char GivenName;
        unsigned short int b_day;       // day of birth (value between 1 and 30
        unsigned short int b_month;     // month of birth (value between 1 and 12)
        unsigned short int b_year;      // year of birth (value between 1950 and 1990
        unsigned short int Age;         // result when birthday and actual date is combined
    
        char VoiceHeight;
        char VoiceType;
        char MusicStyle;
        char Primary;
        char Secondary;
        unsigned short int SkillPrimary;
        unsigned short int SkillSecondary;
    
        unsigned short int SkillSinging;
        unsigned short int SkillGuitar;
        unsigned short int SkillBass;
        unsigned short int SkillDrums;
        unsigned short int SkillKeyboard;
        unsigned short int SkillSongwriting;
    
        unsigned short int Learning;
        unsigned short int Motivation;
        unsigned short int ExpStudio;
        unsigned short int ExpStage;
        unsigned short int Exp;  // "durchschnitt" of studio and stage experience
    
        int ran_b_year(b_year)
        {
            b_year = 1950+(rand()%60);
            return b_year;
        }
    
        int ran_b_month(b_month)
        {
            b_month = 1+(rand()%12);
            return b_month;
        }
    
        int ran_b_day(b_day)
        {
            if (b_month == 2)
            {
                b_day = 1+(rand()%27);
            }   
            else
            {
                b_day = 1+(rand()%30);
            }
            return b_day;
        }
    };
    

    mfg thomas

    ps: naja, bisher wurden ja schon einige fehler behoben... aber das mim konstruktor krieg einfach nich auf die reihe 😞
    habs jetzt auch nochmal außerhalb der klasse versucht, diesmal ohne destruktor, aber es geht immernoch nicht...



  • #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    class Musician
    {
        public:
        Musician();
    
        char Name;
        char GivenName;
        unsigned short int b_day;
        unsigned short int b_month;
        unsigned short int b_year;
        unsigned short int Age;
    
        char VoiceHeight;
        char VoiceType;
        char MusicStyle;
        char Primary;
        char Secondary;
        unsigned short int SkillPrimary;
        unsigned short int SkillSecondary;
    
        unsigned short int SkillSinging;
        unsigned short int SkillGuitar;
        unsigned short int SkillBass;
        unsigned short int SkillDrums;
        unsigned short int SkillKeyboard;
        unsigned short int SkillSongwriting;
    
        unsigned short int Learning;
        unsigned short int Motivation;
        unsigned short int ExpStudio;
        unsigned short int ExpStage;
        unsigned short int Exp;
    
        unsigned short ran_b_year(unsigned short b_year)
        {
            b_year = 1950+(rand()%60);
            return b_year;
        }
    
        unsigned short ran_b_month(unsigned short b_month)
        {
            b_month = 1+(rand()%12);
            return b_month;
        }
    
        unsigned short ran_b_day(unsigned short b_day)
        {
            if (b_month == 2)
            {
                b_day = 1+(rand()%27);
            }   
            else
            {
                b_day = 1+(rand()%30);
            }
            return b_day;
        }
    };
    
    Musician::Musician()
        {
        b_day=ran_b_day(b_day);
        //genauso bei den anderen
        //aber wozu braucht man dafuer einen parameter?
        //dannach deine ganzen restlichen variablen initialisieren
        };
    

    wuerde die ganzen variablen noch in die konstruktor initialisierungsliste packen. bei deinen zufallsfunktionen wuerd ich referenzen nehmen. der parameter ist wie ich das sehe wohl ueberfluessig. auf parametertypen in den funktionen achten. einen typedef fuer unsigned short definieren.



  • hmm nochmals danke für die hilfe!
    habs zwar bis jetzt nicht hinbekommen, aber vielleicht bin ich auch einfach nich mehr fit genug...
    ich werd jetzt ins bett gehn und dann morgen nochmal mein glück versuchen, sonst verzweifel ich noch 😉

    morgen schreibe ich dann meine ergebnisse!
    und nun gute nacht, und nochmals danke... bisher hast du mir schon sehr viel geholfen (auch wenns eigentlich nur anfänger-sachen sind)!!

    mfg thomas



  • so, ich glaub ich habs jetzt fast. die fehlerzahl is von ca. 20-30 auf einen gesunken. jetzt weiß ich aber wieder nich weiter. ich hoffe ihr könnt mir noch hierbei helfen...

    #include <time.h> // fuer time
    #include <stdlib.h> // fuer srand
    #include <iostream> // fuer cout
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();
    /*
        char Name;
        char GivenName;
    */
        USI b_day;       // day of birth (value between 1 and 30
        USI b_month;     // month of birth (value between 1 and 12)
        USI b_year;      // year of birth (value between 1950 and 1990    
    /*
        char VoiceHeight;
        char VoiceType;
        char MusicStyle;
        char Primary;
        char Secondary;
        USI SkillPrimary;
        USI SkillSecondary;
    
        USI SkillSinging;
        USI SkillGuitar;
        USI SkillBass;
        USI SkillDrums;
        USI SkillKeyboard;
        USI SkillSongwriting;
    
        USI Learning;
        USI Motivation;
        USI ExpStudio;
        USI ExpStage;
        USI Exp;  // "durchschnitt" of studio and stage experience
    */
        int ran_b_year()
        {
            b_year = 1950+(rand()%60);
            return b_year;
        }
    
        int ran_b_month()
        {
            b_month = 1+(rand()%12);
            return b_month;
        }
    
        int ran_b_day()
        {
            if (b_month == 2)
            {
                b_day = 1+(rand()%27);
            }   
            else
            {
                b_day = 1+(rand()%30);
            }
            return b_day;
        }
    };
    
    int Musician::Musician()
    {
        b_year=ran_b_year();
        b_month=ran_b_month();
        b_day=ran_b_day();
        USI b_year;
        USI b_month;
        USI b_day;
    };
    

    der angezeigte fehler lautet:
    82 return type specification for constructor invalid

    mfg thomas



  • Dauermuede schrieb:

    int Musician::Musician()
    {
        b_year=ran_b_year();
        b_month=ran_b_month();
        b_day=ran_b_day();
        USI b_year;
        USI b_month;
        USI b_day;
    };
    

    Wieso int? Konstruktoren haben keinen Rückgabetyp.
    Und wieso ein Semikolon am Ende?



  • noch was:
    kann man die variablen eigentlich (wieder) als private deklariern? die funktion zur ansteuerung steht ja in der klasse selbst!? oder gehts dann nich mehr bzw. kommt dann was anderes raus?
    die funktionen, müssen diese public sein? sie müssen ja eigentlich nicht von außen angesteuert werden...

    danke,
    thomas



  • der konstruktor hat keinen rueckgabewert - also

    int Musician::Musician()
    

    aus

    Musician::Musician()
    

    umaendern.

    USI b_year;
    USI b_month;
    USI b_day;
    

    muss auch raus.



  • danke MFK!
    jetzt hats ohne probleme kompiliert!!

    kannst du mir nun vielleicht noch bei meinen anderen fragen helfen?

    mfg thomas



  • ja, du kannst die funktionen und die variablen private machen wenn du sie nicht von 'aussen' benoetigst. innerhalb der klasse kann jedes element auf jedes andere zugreifen - also public funktionen koennen auch auf private daten oder funktionen zugreifen.



  • @ Cpt.Tanga:
    die variablen sin jetzt auch raus!

    auch dir nochmal danke 🙂

    mfg thomas



  • super, jetzt funktioniert alles, wie ich es haben wollte...
    vielen danke nun euch und vorallem dir Cpt.Tanga!

    ich glaub jetzt komm ich wieder etwas weiter 😉

    mfg thomas



  • Dauermuede schrieb:

    int ran_b_year()
        {
            b_year = 1950+(rand()%60);
            return b_year;
        }
    

    Ich picke mal diese Methode raus. Das gilt aber auch für die anderen.

    Es ist nicht sinnvoll, hier die Membervariable zu setzen und zurückzugeben. Wenn du die Methode so wie in deinem Konstruktor benutzt, passiert folgendes:

    (in der Methode)
    - b_year wird gesetzt
    - der Wert von b_year wird zurückgegeben
    (im Konstruktor)
    - b_year wird nochmal gesetzt (auf den Wert, den es schon hat)

    Entweder:

    Die Methode setzt die Membervariable und gibt nichts zurück.

    Oder:

    Die Methode ermittelt den Zufallswert und gibt ihn zurück, lässt aber die Membervariable in Ruhe.

    Wenn du beides vermischst, gibt das nur Käse.



  • wenn mans so sieht kann man die fufallsfunktionen auch ganz in den konstruktor auslagern (is ja eher unwahrscheinlich dass man nachtraeglich nochmal zufaellig das alter setzen moechte) - haette man auch gleich ne bessere performance 😃 .



  • hab den rückgabewert jetzt rausgenommen...
    es funktioniert zwar beides, aber da "return" überflüsig zu sein scheint, hab ichs jetzt entfernt.
    danke auch hierfür!

    mfg thomas


Anmelden zum Antworten