Probleme mit einer Klasse...



  • 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



  • Cpt.Tanga schrieb:

    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 😃 .

    gut hab ich jetzt auch gemacht...
    wenn du sagst, dass es der perfomance dient, wirds schon stimmen 😉 .
    ich mein jetzt spielt das noch keine rolle, aber das projekt befindet sich ja noch sehr am anfang 😉

    mfg thomas



  • hmm hab jetzt wieder ein problem...

    rand() scheint nich mehr zu funktionieren 😞

    ich hab einen Array erstellt (Musician Musi[3]), was am anfang auch funktioniert hat... aber wenn ich jetzt kompiliere, kommen immer die gleichen werte raus, beim ausführen. hab dann wieder "Musician Musi[3]" rausgenommen, aber es bleibt jetzt bei den gleichen werten, obwohl ich an den random-funktionen nichts geändert habe!

    könnte das problem vielleicht an dev c++ liegen?

    aber bei einem anderen "zufalls-programm" funktioniert alles einwandfrei



  • du musst srand() vorher aufrufen (mit time(0)) aber nicht im konstruktor und nur 1 mal im programm-am besten ganz am anfang in der main.



  • es steht ja am anfang der main-funktion und wird nur einmal ausgeführt... die ganze zeit hats ja geklappt keine ahnung warums jetzt nich mehr tut!?!

    main.cpp

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

    people.h

    #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();
    
        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
    };
    
    Musician::Musician()
    {
        int ran_b_year()
        {
            b_year = 1950+(rand()%41);
        }
    
        int ran_b_month()
        {
            b_month = 1+(rand()%12);
        }
    
        int ran_b_day()
        {
            if (b_month == 2)
            {
                b_day = 1+(rand()%27);
            }   
            else
            {
                b_day = 1+(rand()%29);
            }
        }
    }
    


  • du kannst keine funktionen inerhalb von funktionen schreiben,
    (dein compiler sollte sich beschweren und sowas sagen wie "error: primary-expression expecteted")
    versuchs mal so:

    //people.h
    #include <ctime>
    #include <cstdlib> //fein die c++ header verwenden
    #include <iostream>
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();
    
        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
    };
    
    Musician::Musician()
    {
            b_year = 1950+(rand()%41);
    
            b_month = 1+(rand()%12);
    
            if (b_month == 2) b_day = 1+(rand()%27);
            else b_day = 1+(rand()%29);
    }
    
    //main.cpp
    #include "people.h"
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        int i;
    
        Musician One;
        Musician Two;
        Musician Three;
    
        cout << "Geburtstag   Musiker 1: " << One.b_day << endl;
        cout << "Geburtsmonat Musiker 1: " << One.b_month << endl;
        cout << "Geburtsjahr  Musiker 1: " << One.b_year << endl;
        cout << "Geburtstag   Musiker 2: " << Two.b_day << endl;
        cout << "Geburtsmonat Musiker 2: " << Two.b_month << endl;
        cout << "Geburtsjahr  Musiker 2: " << Two.b_year << endl;
        cout << "Geburtstag   Musiker 3: " << Three.b_day << endl;
        cout << "Geburtsmonat Musiker 3: " << Three.b_month << endl;
        cout << "Geburtsjahr  Musiker 3: " << Three.b_year << endl;
        cin >> i;
    
        return 0;
    }
    

    es nützt übrigens nichts, eine eigene headerdatei für die klasse zu schreiben, wenn du ihr nicht auch eine eigene .cpp datei gibst.



  • nachdem ich es jetzt im konstruktor so umgeschrieben habe, funktioniert es wieder. was mich nur verwundert: vorher hat es auch funktioniert, so wie ich es vorhin gepostet habe 😕

    naja hauptsache ist, dass es wieder geht! danke!

    zur sache mit dem header:
    der header wird noch erweiter... die klasse ist also nur ein teil davon. der grund, dass ich ein header verwende, ist eigentlich "nur" die übersichtlichkeit. ich will nicht alles in die main.cpp packen. somit bliebe das programm auch "modular".

    mfg thomas



  • hallo!

    habe erneut ein problem mit meiner klasse... diesmal gehts aber ausnahmsweise NICHT ums geburtsdatum. das scheint jetzt endlich stabil zu sein.

    jetzt geht es um die "namenvergabe". hier hat eigentlich alles am anfang funktioniert (den code habe ich vorerst mal von "00x" - sorry für den "klau" 🙄 ). dann habe ich eine zweite datei auslesen wollen, die dann den vornamen bestimmt. da kam das
    1. problem auf: es wurde nur der nachname zufällig bestimmt... "GivenName" blieb immer leer.

    doch nun gibt es ein weiteres problem... wieder ohne dass ich den code verändert hatte:
    jetzt wird nur noch die erste zeile aus der datei für alle namen genommen... und das immer!

    hier der code vom konstruktor:

    Musician::Musician()
    {
        b_year = 1950+(rand()%41);
    
        b_month = 1+(rand()%12);
    
        if (b_month == 2) b_day = 1+(rand()%27);
        else b_day = 1+(rand()%29);
    
        ran_Name();
        ran_GivenName();
        ran_VoiceHeight();
        ran_VoiceType();
    }
    
    ran_Name()
    {
        int zeile1 = 1+(rand()%73);
        ifstream file;
        file.open("names.txt");
        // for(int w = 1; w <= zeile1; w++)
        getline(file,Name);
        file.close("names.txt");
    }
    
    ran_GivenName()
    {
        int zeile2 = 1+(rand()%58);
        ifstream file2;
        file2.open("gnames.txt");
        // for(int x = 1; x <= zeile2; x++)
        getline(file2,GivenName);
    }
    
    ran_VoiceHeight()
    {
        int zeile3 = 1+(rand()%2);
        ifstream file3;
        file3.open("voice_h.txt");
        // for(int y = 1; y <= zeile3; y++)
        getline(file3,VoiceHeight);
    }
    
    ran_VoiceType()
    {
        int zeile4 = 1+(rand()%2);
        ifstream file4;
        file4.open("voice_t.txt");
        // for(int z = 1; z <= zeile4; z++)
        getline(file4,VoiceType);
    }
    

    die funktionen hatte ich anfangs auch direkt im konstruktor (auf die gleiche art, wie diejenigen fürs geburtsdatum...

    danke schonmal,
    thomas

    edit: könntet ihr mir vielleicht auch erklären, für was die for-schleife gut ist? anfangs hat es nämlich sowohl mit als auch ohne einwandfrei funktioniert, weshalb ich sie dann auskommentiert habe...

    edit2: es gibt bei dem ganze übrigens keine compiler-fehler...



  • bitte helft mir!
    ich komm da echt nich weiter... 😞


Anmelden zum Antworten