class



  • so dank eure hilfe habe ich mein code jetzt einbischen verbessert, ich konnte leider nicht alles umsetzen bzw ändern was ihr mir empfohlen habt zb mit [30] muss weg usw.. weil dann bekam ich fehlermeldungen.
    so kann man das Programm fehlerfrei kompilieren, aber ich habe ein Problem mit der Ausgabe.
    PS: Schauen Sie die main funktion bitte an da habe ich das problem.

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    class teilnehmer
    {
    private :
        char vorname [30] ;
        char nachname [30];
        int matrikelnummer;
    public:
        teilnehmer ();
        teilnehmer (char v[30], int m, char n[30]);
        void print ();
    };
    
    teilnehmer :: teilnehmer ()
    {
    vorname [0] = 0;
    nachname [0] = '-';
    int matrikelnummer = 0;
    }
    
    teilnehmer :: teilnehmer(char v [30], int m, char n[30])
    {
    vorname [30] = v [30];
    matrikelnummer = m;
    nachname [30] = n [30];
    
    }
    
    void teilnehmer :: print ()
    {
    
        if (nachname [0]  != '-')
        {
            cout << "Der Nachname ist : " << nachname  << endl;
        }
    }
    
    int main ()
    {
    	teilnehmer tabelle[16] = {
        teilnehmer  ("Kevin", 123456, "Mueller"),
    
        teilnehmer  ("Franz", 112233, "Schuhmacher"),
    
        teilnehmer  ("Lisa", 102356  , "Fritz"),
    
        teilnehmer  ("Manfred", 258963, "Schmitt"),
    	};
    int i;
    for (i=0 ; i<16 ; i++)
    {
    	/*das Programm kann man Fehlerfrei kompilieren wenn 
         man die cout hier unten nicht benutz, aber ich brauche 
    	 die ausgabe, kann mir jemand bitte zeigen wie die ausgabe richtig wäre?*/
    	cout << tabelle [i].vorname << endl;
    	cout << tabelle[i].matrikelnummer << endl;
    }
        return 0;
    }
    

  • Mod

    Du kannst nicht einfach auf die privaten Attribute einer Klasse zugreifen. Private ist ja gerade genau dafür da! Du musst irgendeine Schnittstelle im public-Bereich deiner Teilnehmerklasse definieren über die du die gewünschten Ausgaben machen kannst. Die übliche Vorgehensweise wäre die Überladung des Operators<<. Das ist aber nicht unbedingt etwas für deinen Kenntnisstand. Die billige Alternative wäre so etwas wie deine print-Funktion, aber stattdessen mit den von dir gewünschten Ausgaben. Oder noch billiger so etwas wie get_matrikelnummer(), dass dann einfach die Matrikelnummer zurückgibt.



  • Da sind noch immer viele Macken drin, die ich beim ersten Mal schon kritisiert habe. Du solltest das, was gesagt wurde, ernst nehmen.

    pava schrieb:

    teilnehmer (char v[30], int m, char n[30]);
    

    müsste tatsächlich heißen:

    teilnehmer (const char v[30], int m, const char n[30]);
    

    wobei die 30 eigentlich überflüssig ist. Man könnte auch const char[] dafür schreiben -- kommt auf dasselbe raus. v und n sind nuneinmal Zeiger hier und keine Arrays -- wegen der angesprochenen Typtransformation.

    pava schrieb:

    void print ();
    

    Hier fehlt ein const am Ende. Sollte so aussehen:

    void print () const;
    

    (Die Funktion print muss/will den Zustand des Objekts nicht ändern.)

    pava schrieb:

    teilnehmer :: teilnehmer(char v [30], int m, char n[30])
    {
    vorname [30] = v [30];
    matrikelnummer = m;
    nachname [30] = n [30];
    }
    

    Man hat Dir schon erklärt, dass das hier sinnfrei ist, was Du machst. Ich habe Dir sogar schon gezeigt, wie man die C-Strings hier richtig kopieren würde. Das [30] hier ist immer noch Nonsense. Klar, es lässt Dich Dein Programm kompilieren, aber es ergibt keinen Sinn. Es macht nicht das, was Du willst. Du willst eine Kette von Zeichen kopieren, maximal 30 (einschließlich Nullterminierung). Was Du machst, ist das 31. Zeichen kopieren, welches im Falle von vorname und nachname nicht existiert, weil Du ja nur 30 Zeichen hast und welches im Falle von v und n auch nicht existieren muss. Du popelst also in einem Speicher rum, der Dir nicht gehört und von dem Du nicht weißt, dass es ihn überhaupt gibt. --> undefiniertes Verhalten

    pava schrieb:

    void teilnehmer :: print ()
    

    hier kommt auch noch ein const an's Ende.

    pava schrieb:

    for (i=0 ; i<16 ; i++)
    {
        /* das Programm kann man Fehlerfrei kompilieren wenn 
           man die cout hier unten nicht benutz, aber ich brauche 
           die ausgabe, kann mir jemand bitte zeigen wie die ausgabe
           richtig wäre? */
        cout << tabelle .vorname << endl;
        cout << tabelle[i].matrikelnummer << endl;
    }
    

    Dass man es fehlerfrei kompilieren kann, heißt nicht, dass der Rest in Ordnung ist. Natürlich kannst Du auf [i]private* Elemente nicht ohne weiteres zugreifen. Das ist ja der Witz von private. Wozu hast Du die print-Funktion? Außerdem solltest Du den Konstanten einen Namen geben, so dass Du sie ändern kannst, indem Du Dein Programm nur an einer Stelle ändern musst.

    const int max_teiln = 16; // <-- eine Stelle. Diese 16 taucht sonst
                              // nirgens mehr auf, nur der Name max_teiln
    teilnehmer tabelle[max_teiln] = {
       u.s.w.
    };
    for (int i=0; i<max_teiln; ++i) {
       tabelle[i].print();
    }
    


  • hallo, danke nochmal für alle die mir geantwortet haben.

    @ Krümelkacker:
    sorry ich wollte nicht das es so rüber kommt. Natürlich habe ich eure Ratschläge ernst genommen, aber ich habe mich halt gefreut als ich das programm Fehlerfrei kompilierte, aber jetzt weiss ich dass das nicht viel heisst.

    der code musste also so aussehen, wenn ich dich dieses mal richtig verstanden habe:

    teilnehmer :: teilnehmer(const char v [], int m, const char n[])
    {
    vorname [0]  = v [0]  ;
    matrikelnummer = m;
    nachname [0] = n [0] ;
    

    somit greife ich jetzt auf das erste Element zu. richtig?

    Gruß pava.



  • pava schrieb:

    teilnehmer :: teilnehmer(const char v [], int m, const char n[])
    {
    vorname [0]  = v [0]  ;
    matrikelnummer = m;
    nachname [0] = n [0] ;
    

    somit greife ich jetzt auf das erste Element zu. richtig?

    Genau. Und dahinter steht immer noch Müll drinnen...
    Ein Array besteht nämlich meistens aus mehr als nur einem Element und du willst doch sicherlich alle Elemente kopieren. Und auch dazu hat dir krümelkacker schon die Lösung präsentiert: std::strncpy.



  • hallo,
    nach kurzer Besprechung mit dem Professor ist es endlich soweit, ich habe es geschafft, und mein Programm sieht jetzt so aus :(Endphase) 😉

    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    class teilnehmer 
    { 
    private : 
        string vorname ; 
       string nachname ; 
        int matrikelnummer; 
    public: 
        teilnehmer (); 
        teilnehmer (string v, int m, string n); 
        void print (); 
    }; 
    
    teilnehmer :: teilnehmer () 
    { 
    vorname  = ""; 
    nachname  = "-"; 
    matrikelnummer = 0; 
    } 
    
    teilnehmer :: teilnehmer(string v, int m, string n) 
    { 
    vorname  = v ; 
    matrikelnummer = m; 
    nachname  = n ; 
    
    } 
    
    void teilnehmer :: print () 
    { 
    	if (nachname   != "-") 
        {
    		cout << "Der Vorname : " << vorname << " und die Matrikelnummer ist : "<< matrikelnummer << endl;
    		cout <<	"Der Nachname ist : " << nachname  <<endl;      
        } 
    } 
    
    int main () 
    { 
        teilnehmer tabelle[16] = { 
        teilnehmer  ("Kevin", 123456, "Mueller"), 
    
        teilnehmer  ("Franz", 112233, "Schuhmacher"), 
    
        teilnehmer  ("Lisa", 102356  , "Fritz"), 
    
        teilnehmer  ("Manfred", 258963, "Schmitt"), 
        }; 
    int i; 
    for (i=0 ; i<16 ; i++) 
    { 
        tabelle[i].print();
    }; 
        return 0; 
    }
    

    so ich glaube jetzt gibts nichts mehr zu meckern oder? ausser bei

    const int max_teilnehmer = 16;
    

    danke schön nochmal und bis zum nächsten Programm.

    MfG Pava



  • Da gibts noch zwei Sachen, die mir gerade so aufgefallen sind:

    • Formatierung - Formatier deinen Code anständig! Das ist schreklick zu lesen!
    • Nutze Initialisierungslisten


  • drakon schrieb:

    Da gibts noch zwei Sachen, die mir gerade so aufgefallen sind:

    • Formatierung - Formatier deinen Code anständig! Das ist schreklick zu lesen!
    • Nutze Initialisierungslisten

    Sry ich bin Anfänger, wie meinst du das mit der Formatierung?



  • An gewissen Stellen ist deine Einrückung ziemlich unübersichtlich.

    Wenn ein neuer Block mit { beginnt, rückst du eine Ebene mehr ein, bei } eine weniger. Dadurch sieht der Code schon viel lesbarer aus.



  • pava schrieb:

    Sry ich bin Anfänger, wie meinst du das mit der Formatierung?

    Einrückung, diese auch konsistent durchziehen.
    Die ";" ebenso konsistent setzen.
    Keine unnötigen Leerzeilen und Leerzeichen.
    USW.




Anmelden zum Antworten