Klassen/Class in C++ ? Verständnis Problem !



  • Hallo

    Mein Problem ist, daß ich die "Klassen bzw Class" nicht verstehe. Ich arbeite mich schon durch das dritte C++-Buch und hab mir einiges aus dem Internet ausgedruckt.

    Meine Fragen sind nun Folgende:

    1. Wofür benötigt man Klassen ?
    - Ich hab das so verstanden: Klassen ist ein (teilweise)
    zugriffsgeschützter "Bereich/Speicher" auf den nur autorisierte Personen
    bzw Anweisungen zugriff haben.

    2. Wie bzw. wann kann ich außerhalb einer Klasse auf Daten aus einer Klasse
    zugreiffen.
    - ???

    Es wäre nett wenn mir jemand die Funktion des folgenden Prog. erläutern könnte
    oder mir die Funktion an einem anderen Beispiel erklären könnte.
    -------------------------------------------------------

    Beispielprogramm Kontodaten anzeigen:

    Header-Datei : KONTO.H

    #include <string>

    class KONTO
    {

    private:
    unsigned int Kontonummer;
    double Kontostand;
    string Inhaber;

    public:

    KONTO(unsigned int, double,const string&);

    ~KONTO();
    void KontenDatenAnzeigen();
    };

    CPP-Datei: KONTO.CPP

    #include<iostream>
    #include"KONTO.H"

    KONTO::KONTO(unsigned int_Kontonummer,double_Kontostand,const string&_Inhaber)
    {
    Kontonummer = _Kontonummer;
    Kontostand = _Kontostand;
    Inhaber = _Inhaber;
    }

    KONTO::~KONTO()
    {
    ::std::cout << "\n Objekt gelöscht!\n";
    }

    void KONTO::KontenDatenAnzeigen()
    {
    ::std::cout << "\n Kontonummer = " << Kontonummer << Kontonummer
    <<\nKontostand = " << Kontostand << \n Inhaber = " << Inhaber << "\n";
    }

    MAIN-Datei: MAIN.CPP

    #include<iostream>
    #include"KONTO.H>

    int main()
    {
    KONTO ErstesKonto(1234, 10203.99,"H.Mueller");

    ErstesKonto.KontenDatenAnzeigen();

    return(0);
    }

    ------------------------------------------------------------

    Mir würden auch Kommentare zu den einzelnen Zeilen reichen !!!!!!

    Im voraus tausend mal DANKE !!!! 😃

    Gruß
    Thiemo



  • #include <string> 
    
    class CKonto 
    { 
    
    private: 
       unsigned int m_Kontonummer; 
       double m_Kontostand; 
       string m_Inhaber; 
    
    public: // Kann von außen drauf zugegriffen werden...
      CKonto(unsigned int, double, const string&); // Konstruktor... 
      ~CKonto(); // Destuktor...
      void KontenDatenAnzeigen(); 
    };
    

    Konto.cpp

    #include <iostream> 
    #include "Konto.h" 
    CKonto::CKonto(unsigned int Kontonummer, double Kontostand, const string& Inhaber) // Konstruktor
    { 
       m_Kontonummer = Kontonummer; // Die Membervariable m_Kontonummer bekommt den werd der Variable Kontonummer
       m_Kontostand  = Kontostand; // Die Membervariable m_Kontostand bekommt den werd der Variable Kontostand
       m_Inhaber     = Inhaber; // Die Membervariable m_Inhaber bekommt den werd der Variable Inhaber
    } 
    
    CKonto::~CKonto() // Destruktor
    { 
       ::std::cout << "\n Objekt gelöscht!\n"; // Bevor die Klasse CKonto zerstört wird noch was ausgeben...
    } 
    
    void CKonto::KontenDatenAnzeigen() // Funktion aus der Klasse CKonto
    { 
       ::std::cout << "\n Kontonummer = " << m_Kontonummer << m_Kontonummer << \n Kontostand = " << m_Kontostand << \n Inhaber = " << m_Inhaber << "\n"; // wenn bsp. CKonto konto; konto.KontenDatenAnzeigen(); dann wird die Funktion ausgeführt..
    }
    

    main.cpp

    #include <iostream> 
    #include "Konto.h" 
    
    int main() 
    { 
       CKonto ErstesKonto(1234, 10203.99, "H. Mueller "); // CKonto erstellen und die Werte übergeben... hier wird der Konstruktor von CKonto aufgerufen!
    
       ErstesKonto.KontenDatenAnzeigen(); 
    
       return(0); 
    }
    

    Hmm.. hast aber das falsche unterforum gewählt... MFC ist wieder was anders als Konsole/C++



  • Danke !!! Ich werd die Frage gleich im anderen Forum stellen.

    Aber da hätte ich noch ein paar Fragen:

    1. Wie genau kann ich auf private zugreifen bzw welcher Befehl ist zustädig und wie funktioniert der genau ?

    2. Warum zerstört man die Klasse wieder, wofür ist der Destruktor ?

    [quote="(D)Evil"]

    Konto.cpp 
    [cpp]
    #include <iostream> 
    #include "Konto.h" 
    CKonto::CKonto(unsigned int Kontonummer, double Kontostand, const string& Inhaber) // Konstruktor
    { 
       m_Kontonummer = Kontonummer; // Die Membervariable m_Kontonummer bekommt den werd der Variable Kontonummer
       m_Kontostand  = Kontostand; // Die Membervariable m_Kontostand bekommt den werd der Variable Kontostand
       m_Inhaber     = Inhaber; // Die Membervariable m_Inhaber bekommt den werd der Variable Inhaber
    } 
    
    CKonto::~CKonto() // Destruktor
    { 
       ::std::cout << "\n Objekt gelöscht!\n"; // Bevor die Klasse CKonto zerstört wird noch was ausgeben...
    } 
    
    void CKonto::KontenDatenAnzeigen() // Funktion aus der Klasse CKonto
    { 
       ::std::cout << "\n Kontonummer = " << m_Kontonummer << m_Kontonummer << \n Kontostand = " << m_Kontostand << \n Inhaber = " << m_Inhaber << "\n"; // wenn bsp. CKonto konto; konto.KontenDatenAnzeigen(); dann wird die Funktion ausgeführt..
    }
    

    Im voraus DANKE !!!

    Gruß
    Thiemo



  • Hallo

    Auf private Elemente hat man nur innerhalb der Klasse Zugriff. Klasse zerstört man wieder, wenn man Sie nicht mehr braucht. Kleines Beispiel:
    Klasse Intro wird gebarucht, wenn man ein Spiel startet. Sobald man sich aber im Hauptmenü befindet, braucht man dies Klasse nicht mehr und zerstört Sie mit dem Destruktor. In diesem kann man zum Beispiel Speicher wieder freigeben.

    chrische



  • CKonto::CKonto(unsigned int Kontonummer, double Kontostand, const string& Inhaber) // Konstruktor
    { 
       m_Kontonummer = Kontonummer; // Die Membervariable m_Kontonummer bekommt den werd der Variable Kontonummer
       m_Kontostand  = Kontostand; // Die Membervariable m_Kontostand bekommt den werd der Variable Kontostand
       m_Inhaber     = Inhaber; // Die Membervariable m_Inhaber bekommt den werd der Variable Inhaber
    

    ... aber hier bin ich doch nicht mehr in der Klasse, oder .... ?

    Gruß
    Thiemo



  • Hallo

    CKonto::CKonto(unsigned int Kontonummer, double Kontostand, const string& Inhaber) // Konstruktor
    { 
       m_Kontonummer = Kontonummer; // Die Membervariable m_Kontonummer bekommt den werd der Variable Kontonummer
       m_Kontostand  = Kontostand; // Die Membervariable m_Kontostand bekommt den werd der Variable Kontostand
       m_Inhaber     = Inhaber; // Die Membervariable m_Inhaber bekommt den werd der Variable Inhaber
    

    Das ist doch eine Memnberfunktion der Klasse, also hat dies auch Zugriff auf die Variablen der Klasse.

    chrische



  • CKonto::CKonto(unsigned int Kontonummer, double Kontostand, const string& Inhaber)

    Wie genau muss ich diese Zeile verstehen ?

    Das erste CKonto ist der Klassenname ?

    mit dem 2. CKonto werden Kontonummer, Kontostand,.... zugewiesen ?

    Gruß Thiemo



  • Hallo

    Das erste CKonto steht für den Namen der Klasse.
    Der Zweite Name steht für den Namen der Funktion. In diesem Fall der konstruktor. das erkennt amn daran, dass der Name der Funktion gleich ist mit dem Namen der Klasse. Die Variablen in der Klammer sind die Parameter, die dem Konstruktor mitgegeben werden.

    chrische



  • chrische5 schrieb:

    Hallo

    Das erste CKonto steht für den Namen der Klasse.
    Der Zweite Name steht für den Namen der Funktion. In diesem Fall der konstruktor. das erkennt amn daran, dass der Name der Funktion gleich ist mit dem Namen der Klasse. Die Variablen in der Klammer sind die Parameter, die dem Konstruktor mitgegeben werden.

    chrische

    Also sind die Variablen in der Klammer, die Parameter aus private. Oder ...



  • Hallo Chrische5

    Bin gleich wieder im netz. Muß kurz was essen.

    gruß
    Thiemo



  • Hallo

    Thiemo schrieb:

    Also sind die Variablen in der Klammer, die Parameter aus private.

    Nein. Die Variablen in der Klammer werden der Klasse übergeben und du übergibst diese Variabelen mit

    m_Kontonummer = Kontonummer; 
    m_Kontostand  = Kontostand;
    m_Inhaber     = Inhaber;
    

    den Memebervariablen der Klasse. Du könntest die Werte in der Klammer aber auch noch bearbeiten:

    m_Kontonummer = Kontonummer + 10; 
    m_Kontostand  = Kontostand + 10; 
    m_Inhaber     = Inhaber + "Hallo";
    

    chrische



  • Dann ist also "m_Kontonummer" in private und übergibt seinen Wert mit dem Befehl: m_Kontonummer = Kontonummer; an die Variable: "Kontonummer".
    Richtig ???



  • Hallo

    Thiemo schrieb:

    Dann ist also "m_Kontonummer" in private und übergibt seinen Wert mit dem Befehl: m_Kontonummer = Kontonummer; an die Variable: "Kontonummer".
    Richtig ???

    Leider nicht ganz:
    m_Kontonummer ist eine Memebervariable deiner Funktion (deswegen auch das m_) und mit der Zeile m_Kontonummer = Kontonummer wird der Wert von Kontonummer an m_Kontonummer zugewiesen und nicht andersherum.

    chrische



  • Hmm tut mir ja leid, aber das stimmt nicht ganz!

    m_Kontonummer ist eine Memebervariable deiner Funktion

    Nein, es ist eine Membervariable deiner Klasse! und Kontonummer ist eine Variable der Funktion---



  • Hallo

    (D)Evil schrieb:

    Hmm Nein, es ist eine Membervariable deiner Klasse! und Kontonummer ist eine Variable der Funktion---

    Du hast natürlich Recht und genau das meinte ich auch.

    chrische



  • Ich habs leider "IMMER NOCH NICHT" kappiert. Sorry, daß ich Euch so nerve.
    Aber...
    Was genau bzw. welcher Befehl genau erlaubt mir das Zugreifen auf private ?



  • Hallo

    Also noch einmal langsam. Das Schlüsselwort private bedeutet, dass nur Memberfunktionen der Klasse auf diese Variablen oder Funktionen (die private deklariert sind) zugreifen dürfen.

    class Konto
    {
    public:
    int m_GetKontoStand(void) const;
    void m_SetKontoStand(const p_iNeuerKontoStand)
    {
    m_iKontoStand = p_iNeuerKontoStand;
    }
    private:
    int m_iKontoStand;
    };
    

    Wenn du jetzt eine Insatnz dieser Klasse anlegst, (siehe anderer Thread) dann passiert folgendes:

    Konto my_Konto //Insatnz wird angelegt
    my_Konto.m_iKontostand = 500; //Fehler, weil du auf private Memebervariable zugreifst
    my_Konto.SetKontoStand(500); //jetzt setzt du die private Variable auf 500
    

    Du kannst also, wenn du eine Instanz der Klasse erzeugt hast nur noch auf Funktionen oder Variablen zugreifen, die nicht private deklariert sind.

    chrische


Anmelden zum Antworten