Wieder mal C++ Problem

gingele

Level-1
Beiträge
227
Reaktionspunkte
42
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab mal eine Frage zu C++. Wenn ich einem Konstruktor
einen Parameterwert mitgebe und die Angelegten Klassen über ein
Pointerarray neu Anlege, wird dann der Konstruktorparameterwert
jeweils gespeichert oder nicht. Da bei mir im unten angezeigten
Beispiel bei der Ausgabe typ nur Schrott steht.

Code:
Bsp.
#include<iostream>
using namespace std;


class Medien{
    
    public:
        Medien(char typ[]="Medien");
       // Medien(int 0);

        void ausgabe();

    protected:
        int signatur;
        char titel[20];
        char typ[10];
        bool status;
};


Medien::Medien(char typ[]){

    cout << "\nBitte " << typ << "daten eingeben:"  << endl;
            cout << "\nSignatur:";
            cin >> signatur;
            cout << "\nTitel:";
            cin >> titel;        
            status=true;
            
    
        } 

void Medien::ausgabe(){
            //cout << endl << "start" << "***" << typ << "***" << "ende" << endl;  //TEST
            cout << endl 
                 << signatur 
                 << '\t'
                 << typ     
                 << '\t'     
                 << titel; 
        } 

int main(){
    const int n = 10;  // Speichergröße für jeweiligen Klassentyp
    int m_zae = 0;
    
    
    Medien* ptm[n];
    

    
     if(m_zae<n){
       cout << "\n----- Neues Medium! -----" << endl;
       ptm[m_zae]=new Medien();
       m_zae++;
       }
       else{
       cout << "!!!Speicher voll!!!" << endl;
       };
        
     cout << "Medienbestand" << endl;
       for(int j=0; j<m_zae; j++){ 
       ptm[j]->Medien::ausgabe();
       }
                                    
        
    return 0;
}

gruß Frank
 
Das Problem bei deinem Programm ist, dass die Membervariable typ durch den Parameter typ überdeckt wird.

Wenn du unbedingt für einen Parameter (gilt für lokale Variablen ebenso) den gleichen Namen wie für eine Membervariable verwenden möchtest, musst du auf die Membervariable mittels des this Zeigers zugreifen.

Also z.B. so:

Code:
Medien::Medien(char typ[]){
    strcpy(this->typ, typ);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ziemlich sonderbar

Wie Thomas schon sagte, Buchstaben kosten nix und man sollte deshalb EINDEUTIGE Namen und Bezeichner verwenden.

Ansonsten:

In einem Constructor sollte man eine Instanz einer Klasse erzeugen aber keine "Dialoge" mit der Oberfläche etc. durchführen. Regel: Buisiness Logic von Präsentation sauber trennen.

Ein Constructor mit default Parametern ist TABU, eine gute Regel ist, den Standard Constructor sogar private zu machen, damit einem nix uninitialisiert durchrutscht.

Das Main erzeugt im Original Code nur eine Instanz, die 9 weiteren, die unten per Pointer aufgefufen werden, sind "dangling Pointer", in der Regel führt das zum Absturz.
 
Zurück
Oben