Probleme mit einer Klasse...



  • 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... 😞



  • deine ganzen funktionen sollten im grundgeruest so in etwa aussehen:

    void ran_any()
        {
        int zeile=1+(rand()%anzahlZeilenInDatei);
        ifstream file;
        file.open("dateiname.txt");
        for(int i=1;i<=zeile;++i)
            getline(file,stringVar);
        file.close();
        };
    

    dann muesste es auch mit dem zufall wieder stimmen. in der variable 'zeile' steht also die nummer der zeile welche zufaellig ausgewaehlt wurde. dann wird in der for schleife solange aus der datei ausgelesen bis man an dieser zeile angekommen ist, und dieser inhalt sollte dann in 'stringVar' stehen.



  • void 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();
    }
    

    hier... habs ja so 😕
    am anfang hats ja auch funktioniert... nur jetzt gehts nimmer 😡
    hab jetzt erst gedacht, es lag daran, dass ich die funktion nicht mit void initialisiert habe, aber das wars nun auch nich...



  • es ist zum verzweifeln...
    hab jetzt die for-schleife in eine "umständliche" while- und if-schleife umgeschrieben... aber immernoch das gleiche!
    wie wenn die erste zeile in der variable festgefressen wäre...
    die variable bzw. den string explizit leer zu definieren bringt auch nix -> es kommt dann auch die erste zeile aus der datei



  • die funktion an sich sollte funktionieren. aber das ungeschickte an diesen funktionen ist dass die anzahl der zeilen in der datei immer mit der in der funktion festgelegten uebereinstimmen muessen.

    Dauermuede schrieb:

    es wurde nur der nachname zufällig bestimmt... "GivenName" blieb immer leer

    laesst darauf hinweisen das sich in der datei weniger eintraege befinden als in den funktionen angegeben. ich gehe mal davon aus das 'Name' ein string ist-kein char array.



  • ja, "Name" ist als string definiert... ist da z.b. char[20] eher angebracht?

    wie sollte ich es denn sonst machen, damit nur eine einzige zeile gelesen wird? ich brauch ja nur einen namen...

    achso... die txt-datei hat die namen lediglich untereinander angeordnet... bringts da vielleicht was, semikolons nach jeder zeile einzufügen?

    mfg thomas



  • und "durchschnitt" wäre dann average - wenn schon denn schon...



  • also ich werd aus dev-cpp nich schlau...
    auf einmal zeigt der compiler mir fehlermeldungen...

    z.b. meckert er jetzt bei

    using namespace ios;
    

    17 expected namespace-name before ';' token
    17 `<type error>' is not a namespace

    dann folgendes:

    66 ran_Name' undeclared (first use this function) 73void ran_Name()' used prior to declaration
    78 `Name' undeclared (first use this function)



  • das_brot schrieb:

    und "durchschnitt" wäre dann average - wenn schon denn schon...

    hehe ja... eigentlich schon 😉
    aber als ich den kommentar geschreiben hab is mir ums verrecken "average" nich mehr eingefallen...
    danach war ich dann zu faul 🙄 um nach dem wort zu suchen 😉

    mfg thomas

    edit: --> danke dir! 😉



  • lol dann bin ich wenigstens nicht der einzige, der unbedingt engl. kommentieren muss 😃



  • Dauermuede schrieb:

    bringts da vielleicht was, semikolons nach jeder zeile einzufügen?

    nein.

    wie gesagt die von mir oben gepostete funktion sollte funktionieren. zeig am besten nochmal deinen jetzigen code.

    Dauermuede schrieb:

    ich brauch ja nur einen namen...

    bekommst ja auch nur einen - die forschleife bitte nicht falsch verstehen 🙂 die liest nur solange bis sie an der gewuenschten zeile angekommen ist (die ja per zufall festgelegt wurde) also 'Name' wird jedesmal ueberschrieben - und wenn halt keine zeilen mehr da sind (datei zuende) wird 'Name' halt mit 'nichts' ueberschrieben.



  • naja... 2 fehlermeldungen hab ich wieder wegbekommen...

    aber die "namespace-fahlermeldung" hab ich noch sowie die aussage, dass Name nicht deklariert sei 😕



  • hier der code:

    #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    using namespace ios;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();             // constructor
    
        string Name;            // musicians last name
        string GivenName;       // musicians given name
    
        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
    
        string VoiceHeight;     // describes the voice height
        string VoiceType;       // describes of whick type the voice is
    /*    string MusicStyle;    // prefered music style
        string Primary;         // copy of the most skilled category
        string Secondary;       // copy of the second most skilled category
        USI SkillPrimary;       // copy of the highest skill
        USI SkillSecondary;     // copy of the second highest skill
    
        USI SkillSinging;       // skill in singing
        USI SkillGuitar;        // skill in guitar
        USI SkillBass;          // skill in bass
        USI SkillDrums;         // skill in drums
        USI SkillKeyboard;      // skill in keyboard
        USI SkillSongwriting;   // skill in songwriting
    
        USI Talent;             // defines maximum of skill to gain in a category
        USI Learning;           // defines speed of learning also influenced by talent
        USI Motivation;         // describes actual motivation and influences also learning speed
        USI ExpStudio;          // studio experience (how many records?)
        USI ExpStage;           // stage experience (how many gigs?)
        USI Exp;                // average of studio and stage experience
    */
    };
    
    Musician::Musician()
    {
        b_year = 1960+(rand()%30);                  // randomly created birth year
    
        b_month = 1+(rand()%12);                    // randomly created birth month
    
        if (b_month == 2) b_day = 1+(rand()%27);    // randomly created birth day
        else b_day = 1+(rand()%29);
    
        void ran_Name();                            // random selection of last name
    }
    
    void 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();
    }
    

    @ das_brot: ja scheint fast... weiß auch nich warum ich den zwang dazu hab 😉

    mfg thomas



  • naja ist ios nicht in std? falls ja kann man doch afaik

    using namespace std::ios
    

    schreiben oder?
    und wo und wie hast du denn 'Name' definiert?
    naja und ansonsten halt nochmal den source 😉 .



  • Name ist ein elem von Musician

    string Musician::Name;
    


  • ran_Name() muss natuerlich auch noch member von deiner klasse sein.



  • hmm hab "using namespace ios;" jetzt auskommentiert... scheint nichts auszumachen. der fehler is zumindest weg, ohne dass neue gekommen sind.
    aber vielleicht kommt das ja auch wieder plötzlich 🙄

    ähm also "Name" is doch in der klasse definiert!? es geht ja um genau DIESES "Name".

    mfg thomas


Anmelden zum Antworten