Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Schlechtes Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.08.2005, 11:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Finde alle Fehler & Fragwürdigkeiten des folgenden Programms

C++:
#include <string>
#include <set>

class Person {
        std::string vorname;
        std::string nachname;

public:
        Person(std::string nachname) :vorname(""), nachname(nachname) { }
        Person(std::string vorname, std::string nachname) :vorname(vorname), nachname(nachname) { }
        Person(Person& source) :vorname(source.vorname), nachname(source.nachname) { }
        Person operator = (Person source) {
                vorname = source.vorname;
                nachname = source.nachname;
                return *this;
        }
        ~Person() { }
};

class Manager: public Person {
        std::set<Person> angestellte;
        Person* vertreter;

public:
        Manager(std::string vorname, std::string nachname) :Person(vorname, nachname) { }
        ~Manager() {
                if (vertreter==NULL) {
                        throw "Kann keinen Manager löschen, da keine Vertretung!";
                }
        }
};

int main() {
        Person p("Donald", "Duck");
        Manager m("Dagobert", "Duck");

        exit(0);
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.08.2005, 12:11 Uhr
Oliver
S2-Pixelgeneral



C++:
Person(std::string nachname) :vorname(""), nachname(nachname) { }
        Person(std::string vorname, std::string nachname) :vorname(vorname), nachname(nachname) { }



Bei den beiden Konstruktoren wird per Value übergeben und damit muss immer der Copy und Zuweisungsoperator von der string-klasse und damit auch der Destruktor aufgerufen werden, das gleiche bei Person operator = (Person source)...



C++:
Person(Person& source) :vorname(source.vorname), nachname(source.nachname) { }



source sollte const sein.


C++:
~Person() { }



Der Destruktor sollte bei Basisklassen virtual sein.



C++:
Manager(std::string vorname, std::string nachname)



Wieder nich per Referenz.


C++:
Person* vertreter;



Sollte mit NULL im Konstruktor initialisiert werden.


C++:
std::set<Person> angestellte;



Hier würde ich lieber pointer auf Person nehmen.


Das ist das, was mir so spontan aufgefallen ist.

--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 14.08.2005 um 12:11 Uhr von Oliver editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.08.2005, 12:22 Uhr
virtual
Sexiest Bit alive
(Operator)


Bis auf den letzten Punkt volle Zustimmung. Wenn Du da Pointer nimmst, musst Du die Speicherverwaltung selbst in die Hand nehmen...

Es gibt aber noch weitere Fehler.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.08.2005, 12:39 Uhr
Oliver
S2-Pixelgeneral



C++:
Person operator = (Person source) {
                vorname = source.vorname;
                nachname = source.nachname;
                return *this;
        }




source sollte const und eine Referenz sein und operator = sollte ebenfalls ne const referenz auf *this zurückgeben.

Außerdem kann der Vertreter nich gesetzt werden und die Angestellten können auch nich bearbeitet werden und es fehlt noch ein Defaultkonstruktor in der Managerklasse.



Zitat:

Wenn Du da Pointer nimmst, musst Du die Speicherverwaltung selbst in die Hand nehmen...



Ich geh mal davon aus, dass die Angestellten als Person an sich schon existieren und nicht erst in der Managerklasse erstellt werden.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 14.08.2005 um 12:48 Uhr von Oliver editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.08.2005, 13:14 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Oliver:

source sollte const und eine Referenz sein und operator = sollte ebenfalls ne const referenz auf *this zurückgeben.


Ja, ist eines der Probleme des Zuweisungsoperators, es gibt aber noch ein weiteres.


Zitat von Oliver:

Außerdem kann der Vertreter nich gesetzt werden und die Angestellten können auch nich bearbeitet werden und es fehlt noch ein Defaultkonstruktor in der Managerklasse.



Wenn dem so wäre, wäre es ein Problem, da hast Du recht.


Zitat:

Ich geh mal davon aus, dass die Angestellten als Person an sich schon existieren und nicht erst in der Managerklasse erstellt werden.

Ja, habe ich noch garnicht drauf geachtet, stimmt aber so gesehen auch.

Dennoch gibt es noch mindestens drei Probleme, welche noch nicht genannt wurden,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 14.08.2005 um 13:16 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.08.2005, 18:37 Uhr
(un)wissender
Niveauwart


operator= sollte niemals eine const Referenz zurückgeben.
Mal ein Problem was hier wohl kaum einer findet (virtual ist das aber auf jeden Fall bewusst):
exit(0) ist böse, weil Destuktoren nicht mehr aufgerufen werden. Darum läuft das Programm auch, normalerweise würde der Destuktor von Manager immer eine const char*-Ausnahme werfen (wenn denn vertreter mit 0 initialisiert worden wäre).
Außerdem sind die includes nicht korrekt. cstdlib für exit fehlt, aber das sollte ja eh raus.
In C++ nimmt man auch nicht mehr NULL, sondern 0.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.08.2005, 19:21 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von (un)wissender:
operator= sollte niemals eine const Referenz zurückgeben.
Mal ein Problem was hier wohl kaum einer findet (virtual ist das aber auf jeden Fall bewusst):
exit(0) ist böse, weil Destuktoren nicht mehr aufgerufen werden. Darum läuft das Programm auch, normalerweise würde der Destuktor von Manager immer eine const char*-Ausnahme werfen (wenn denn vertreter mit 0 initialisiert worden wäre).


Jau, da haben wir ja schon mal einen der noch drei nicht genannten


Zitat:

Außerdem sind die includes nicht korrekt. cstdlib für exit fehlt, aber das sollte ja eh raus.
In C++ nimmt man auch nicht mehr NULL, sondern 0.


Das wäre der vierte, von mir bisher nicht beachtete.


Bleiben noch zwei bisher ungenannte Nette Fehler...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.08.2005, 22:06 Uhr
(un)wissender
Niveauwart


Hm, spontan würde ich sagen, dass std::set eine Vergleichsoperation für Person benötigt, ob nun mit Pointern oder mit Objekten.
Verteter und Angestellte müssten auch noch irgendwie gesetzt bzw. abgefragt werden können.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.08.2005, 22:09 Uhr
(un)wissender
Niveauwart


Man könnte auch noch sagen, dass das Kopieren eines Managers nicht ganz sauber ist. Wer löscht denn den Vertreter, oder löscht den niemand? Oder wer löscht die Angestellten, wenn Pointer? Ev. müßte man hier das Kopieren verbieten oder eine Referenzzählung einführen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.08.2005, 08:25 Uhr
Tommix



'Morgen,
entweder hab ich's überlesen oder den hatte noch keiner:
Destruktoren sollten niemals Ausnahmen werfen (Grund ).

Gruß, Tommix

Dieser Post wurde am 15.08.2005 um 08:26 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: