Verständnisproblem mit Zugriff auf Klassenelemente



  • Tach die Herrschaften 🙂

    ich geh grad das Buch "C++ von A bis Z" durch (ich weiß, das mögen von euch einige nicht^^)

    folgender Code irritiert mich nun etwas:

    /* mensch.h */
    #include <iostream>
    
    #ifndef _MENSCH_H_
    #define _MENSCH_H_
    using namespace std;
    
    class Mensch {
    	public:
    		enum { MANN, FRAU };
    	private:
    		char name[30];
    		unsigned int alter;
    		bool geschlecht;
    		void test_geschlecht( void );
    	public:
    		void erzeuge( const char *n = "Unbekannt",
    					  unsigned int a = 0,
    					  bool g = FRAU);
    }
    #endif
    
    /* main.cpp */
    #include "mensch.h"
    
    int main(void) {
    	Mensch mann;	
    	mann.erzeuge( "Adam", 18, Mensch::MANN);
    

    wenn ich jetzt das Objekt "mann" erzeuge, warum muss ich bei dem Geschlecht immernoch den Bezugsoperator und die Klasse mit angeben.
    -->

    mann.erzeuge( "Adam", 18, Mensch::MANN);
    

    kann ich mit den Klassenmethoden nur auf Elemente in der private-section zugreifen (weil das Geschlecht ja im public-bereich) und falls ja, wieso?

    danke schonmal 🙂



  • Die Parameter die du übergibst sind unabhängig, von dem Object(Klasse) an das du sie übergibst.



  • Jetzt weiß ich auch, warum das Buch als schlecht angesehen wird, wenn ich nur diesen Code-Ausschnitt sehe (Oh Graus!):
    - niemals "using namespace std" in Headern
    - std::string statt char name[30] wäre eindeutig besser
    - Implizite Umwandlung eines Enums (int) nach bool
    (warum wird nicht der enum-Typ benannt und als Member verwendet?)
    - schlechter include-guard Name (Namen mit Unterstrich und anschließendem Großbuchstaben sind für den Compiler reserviert)
    - der include-guard sollte eigentlich ganz nach oben (nicht erst andere Header einbinden)
    - (void) als Parameter ist eigentlich nur in C sinnvoll, in C++: ()
    - ...

    kann ich mit den Klassenmethoden nur auf Elemente in der private-section zugreifen (weil das Geschlecht ja im public-bereich) und falls ja, wieso?

    Nein, innerhalb von Klassenmethoden kann auf alle drei Bereiche (public, protected und private) zugegriffen werden.
    Der enum ist public, damit man ihn beim Aufruf in Mensch::erzeuge(...) angeben kann.

    Fazit: um wirklich gutes (und aktuelles) C++ zu lernen, solltest du dich vllt. nach einem anderen Buch umsehen...



  • thx für die Antworten.

    dann werd ich den Code gleich mal dementsprechend anpassen und neu versuchen zu verstehen^^

    Fazit: um wirklich gutes (und aktuelles) C++ zu lernen, solltest du dich vllt. nach einem anderen Buch umsehen...

    wo wir grad mal dabei sind....gibt es da irgendwelche Empfehlungen von Büchern?



  • Der C++ Primer ist ganz gut für den Einstieg.

    http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/382732274X



  • jein, du kannst mit public fkt. auf private elemente zugreifen. andererseits kannst du die variablen auch direkt als public definieren und dann über das objekt zugreifen.
    das lohnt sich aber nur, wenn das variablen sind, die man sowieso public ändert. das problem dabei ist nur, dass man klassen normalerweise gekapselt anlegen sollte^^


Anmelden zum Antworten