Was haltet ihr von meiner Klasse?



  • Hallo,
    dies ist meine erste Klasse, über die ich ein wenig mal nachgedacht habe, also seit bitte nicht zuuu hart zu mir, aber lasst es Kritik hageln 😉

    Es sollen noch mehr dieser Art entstehen, damit die untereinander agieren können.

    #include <sstream>
    #include <string>
    
    namespace Numbers //Unter diesem Namespace stehen dann auch die anderen Klassen, also
    				  //Binary, HexaDecimal und Octal
    {
    	//Im C++-Primer stand, dass man für jede seiner Klassen möglichst eigene Typen
    	//mittels typedef definieren sollte, also habe ich das gemacht :)
    	typedef int dec_number;
    
    	class Decimal //Meine Klasse für Decimalzahlen
    	{
    	private:
    		dec_number number;
    		std::stringstream ss_number; //Hier wird dann halt von dec_number(int) in die 
    								//anderen Typen, wie bin_number(std::string) umgewandelt
    	public:
    		Decimal();
    		Decimal(const dec_number &number);
    		Decimal(const Decimal &decimal); //Mein Copy-Konstruktor
    		~Decimal();
    
    		Decimal& Numbers::Decimal::operator=(const Decimal &number);
    
    		bool SetDecimal(); //Die Dezimalzahl setzen
    		dec_number GetDecimal() const; //Die Dezimalzahl zurückgeben
    
    		//Diese kann ich erst zur Klasse hinzufügen, wenn die anderen Klassen bestehen
    		//bin_number ToBin(); //number als Binärzahl zurückgeben
    		//hex_number ToHex(); //number als HexZahl zurückgeben
    		//oct_number ToOct(); //number als OctZahl zurückgeben
    	};
    };
    

    Gruß Speedy_92



  • Joa, sieht okay aus, was aber nicht viel heißt, da wir die Implementierung ja nicht sehen können. Aber ganz ehrlich ich würde das mit dem eigenen Typen definieren sein lassen. Ich finde das einfach nur verwirrend, lass den int einen int sein und gut ist, denn den datentyp kennt jeder, dec_number aber nicht.

    Gruß



  • Speedy_92 schrieb:

    also seit bitte nicht zuuu hart zu mir, aber lasst es Kritik hageln 😉

    Hm, okay... erster Kritikpunkt: www.seitseid.de

    Aber nun zur Sache:

    #include <sstream>
    #include <string>
    

    ich sehe nicht dass du in der Klassendefinition irgendwo einen string benutzt. Daher ist der include unnötig. Zum stringstream sag ich später noch was. Solltest du eine der Klassen bei der Implementierung der Methoden brauchen, reicht es, die Header in der.cpp einzubinden.

    //Im C++-Primer stand, dass man für jede seiner Klassen möglichst eigene Typen
    	//mittels typedef definieren sollte, also habe ich das gemacht :)
    	typedef int dec_number;
    

    Stand da auch dass die typedefs einfach in den umgebenden namespace geschmissen werden sollten? Ich würds eher in die Klasse packen.

    dec_number number;
    		std::stringstream ss_number; //Hier wird dann halt von dec_number(int) in die 
    								//anderen Typen, wie bin_number(std::string) umgewandelt
    

    Objekte, die du nur für die Umwandlungen (oder allgemein nur für die Implementierung einzelner Methoden) brauchst, solltest du nur lokal in den entsprechenden Methoden benutzen. Der stringstream hat nichts mit dem internen Zustand der Decimal-Objekte zu tun sondern ist nur eine Hilfsvariable.

    Decimal(const dec_number &number);
    

    Objekte kleiner Typen (z.B. alle eingebauten Typen, also auch int) per Referenz zu übergeben ist zwar möglich, aber allgemein nicht üblich. Die Übergabe per const-Referenz spart zwar eine Kopie des jeweiligen Objekts, allerdings muss die Referenz (intern meist ein Zeiger) erstellt und bei jedem Zugriff dereferenziert werden. Das ist bei kleinen Datentypen teurer als eine Kopie.

    bool SetDecimal(); //Die Dezimalzahl setzen
    

    Welchen Sinn hat diese Funktion ohne Argument? In diesem Fall kannst du auch gleich op= benutzen, wenn du einem Decimal Objekt einen int-Wert zuweisen willst. der nicht-explizite Ctor Decimal(int) ermöglicht das.



  • Okay, sieht nicht schlecht aus 🙂
    Trotzdem einige Anmerkungen, sind eher kleine Dinge und teilweise auch Geschmackssache:

    namespace Numbers // vielleicht zu wenig aussagekräftig, besser Number(ing)System oder so...
    {
        // Das finde ich irgendwie übertrieben, aber kann man schon lassen, 
        // zumal der int ja nicht wirklich wie "normale" ints behandelt wird...
        // Aber dec_number könnte Verwirrung stiften, da nicht klar ist, was gemeint ist
    	typedef int dec_number; 
    
    	class Decimal
    	{
    	private:
            // würde ich nicht als Member, sondern eher lokal in Funktionen
            // benutzen, da es ja nur bei Umwandlungen benötigt wird.
    		std::stringstream ss_number; 
    
    	public:
            // braucht es die Grossen Drei?
    		Decimal(const Decimal &decimal);
    		~Decimal();
    		Decimal& Numbers::Decimal::operator=(const Decimal &number);
    
            // Dieser bool-Rückgabewert erinnert mich an C-Fehlerbehandlung ;)
            // Wo ist eigentlich der Parameter für den neuen Wert?
    		bool SetDecimal();
    	};
    };   // kein Strichpunkt nötig
    

    Edit: Grr, wieder mal zu langsam... Ich hoffe, irgendetwas wurde noch nicht gesagt :p



  • Vielen Dank,
    ach das mit dem

    bool SetDecimal();
    

    wär mir denke ich spätestens bei der Implementierung aufgefallen 🙂

    Also ich persönlich finde es auch sehr schwachsinnig mit den typedefs, aber ich habe gedacht, da es im "Großen Primer" steht, kann es ja nicht verkehrt sein 😉

    Und das mit den namespaces werde ich auch mal fix ändern x)

    Gruß



  • Nexus schrieb:

    // Dieser bool-Rückgabewert erinnert mich an C-Fehlerbehandlung 😉

    äähhmm... wie macht man das denn in C++?



  • Was soll der Sinn und Zweck solcher Klassen sein? Erst, wenn wir das wissen, können wir sie richtig beurteilen. Die Represäntation (binär, dezimal, oktal, ...) ist normalarweise nur für die Ausgabe wichtig. Man muss nicht zwischen Dezimalen und Oktalen Zahlen konvertieren können, da sie ja alle binär dargestellt werden. Nur beim Konvertieren von und zu string macht so etwas Sinn.

    Gruß
    Don06



  • Don06 schrieb:

    Was soll der Sinn und Zweck solcher Klassen sein? Erst, wenn wir das wissen, können wir sie richtig beurteilen. Die Represäntation (binär, dezimal, oktal, ...) ist normalarweise nur für die Ausgabe wichtig. Man muss nicht zwischen Dezimalen und Oktalen Zahlen konvertieren können, da sie ja alle binär dargestellt werden. Nur beim Konvertieren von und zu string macht so etwas Sinn.

    Gruß
    Don06

    Diese Klasse(n) war(en) ja eigentlich nur dazu gedacht um mal eine (gutstrukturierte) Klasse zu erstellen. Für mich ist der einzige Nutzen dieser Klasse(n) der Lerneffekt 🙂



  • äähhmm... wie macht man das denn in C++?

    z.B. mit Exceptions.



  • Speedy_92 schrieb:

    äähhmm... wie macht man das denn in C++?

    Wie gesagt mit Exceptions, wobei das bei Settern für skalare Typen ziemlich übertrieben wäre.

    Was mich aber interessieren würde: Wie hättest du die Fehlerabfrage mit bool implementiert? 😉



  • Nexus schrieb:

    Speedy_92 schrieb:

    äähhmm... wie macht man das denn in C++?

    Wie gesagt mit Exceptions, wobei das bei Settern für skalare Typen ziemlich übertrieben wäre.

    Was mich aber interessieren würde: Wie hättest du die Fehlerabfrage mit bool implementiert? 😉

    Das hätte ich mir bei der Implementierung dann überlegt 😃


Anmelden zum Antworten