Funktion zur Überprüfung der Setzung
-
Sone schrieb:
SeppJ schrieb:
Fuchs aus dem Wald schrieb:
if(var1 = 0 || var2 = 0 || ... ){ return; }vielleicht sowas?
Das ist mindestens auf drei Ebenen falsch.
Hab ich die richtig?
- Falsche bzw. keine Fehlerbehandlung.
- Typ der Variablen missachtet - bei
chrono::durationwäre das nicht 0 sondernduration<...>::zero() - Wert der Variablen kann auch initialisiert bzw. "gesetzt" 0 sein.
Und dann der Größte! Er nutzt ein compound-statement obwohl das gar nicht nötig ist (nur eine Zeile)!

Ich vermute, SeppJs Ebenen sind:
- Ganz unten: = passt hier nicht, es sollte == sein.
- Dazwischen: Wert der Variablen kann auch initialisiert bzw. "gesetzt" 0 sein.
- Oben: Das ganze Vorhaben ist unsinnig.
-
volkard 1:0 Sone
(Ja, ich habe schon verstanden, dass Sones Antwort Ironie war
)
-
SeppJ schrieb:
volkard 1:0 Sone
(Ja, ich habe schon verstanden, dass Sones Antwort Ironie war
)Gut. Es wäre etwas zu offensichtlich gewesen hinzuschreiben dass er den falschen Operator nutzt

P.S.: Mal ganz nebenbei, Volkard, ***?
-
Vielen Dank für eure Antworten erstmal. Ich dachte eher an eine Methode, die einen boolschen Wert zurückgibt, der besagt ob diese bestimmten variablen durch die Set-Methode gesetzt worden sind.
-
nadine.wolken schrieb:
Vielen Dank für eure Antworten erstmal. Ich dachte eher an eine Methode, die einen boolschen Wert zurückgibt, der besagt ob diese bestimmten variablen durch die Set-Methode gesetzt worden sind.
Pro Variable eine Zusatzvariable vom Typ bool. Und beim Aufruf einer Set-Methode wird die Variable gesetzt und begleitend der bool auf true gesetzt.
(Aber das riecht echt nach Designfehler, sorry.)
-
@volkard: Danke für die Antwort erstmal. Wie meinst du pro Variable eine Zusatzvariable? Kannst du mir vllt. ein beispiel geben oder so?
Danke vielmals,
Nadine
-
nadine.wolken schrieb:
@volkard: Danke für die Antwort erstmal. Wie meinst du pro Variable eine Zusatzvariable? Kannst du mir vllt. ein beispiel geben oder so?
Danke vielmals,
Nadine
class AutoDesignfehler { private: double masse; bool masseGesetzt; int anzahlSitzplautze; bool anzahlSitzplautzeGesetzt; public: Auto(){ masseGesetzt=false; anzahlSitzplautzeGesetzt=false; } bool istMasseGesetzt(){ return masseGesetzt; } void setzeMasse(double masse){ this->masse=masse; masseGesetzt=true; } double getMasse(){ if(!masseIstGesetzt) throw logic_error("Och nööö!"); return masse; } //selbes Spiel mit Sitzplätzen }
-
volkard schrieb:
nadine.wolken schrieb:
Vielen Dank für eure Antworten erstmal. Ich dachte eher an eine Methode, die einen boolschen Wert zurückgibt, der besagt ob diese bestimmten variablen durch die Set-Methode gesetzt worden sind.
Pro Variable eine Zusatzvariable vom Typ bool. Und beim Aufruf einer Set-Methode wird die Variable gesetzt und begleitend der bool auf true gesetzt.
(Aber das riecht echt nach Designfehler, sorry.)Gute Idee, aber wie fragt man ab, ob die bool-Variablen korrekt gesetzt worden sind?
-
Jester schrieb:
Gute Idee, aber wie fragt man ab, ob die bool-Variablen korrekt gesetzt worden sind?
Man erzwingt einfach, daß sie korrekzt gesetzt wurden. Dafür ist der Konstruktor da.
Aber warum erzwingt man nicht einfach auch, daß die Hauptvariablen korrekt gesetzt wurden? Wäre viel besser, als irgendwo zur Laufzeit Exceptions zu werfen.
-
Danke volkard :). Du meinst also zu jeder Variablen eine boolsche Variable begleitend?
void setzeSitzplaetze(int sitzplaetze){ this->anzahlSitzplautze = sitzplaetze; anzahlSitzplautzeGesetzt = true; } bool istSitzplaetzeGesetzt(){ return anzahlSitzplautzeGesetzt; }Wäre das so ok für die Sitzplaetze?
-
class Auto { private: double masse; int anzahlSitzplaetze; public: Auto(double masse,int anzahlSitzplaetze) :masse(masse) ,anzahlSitzplaetze(anzahlSitzplautze){ //fertig. Das Setzen kann nicht vergessen werden. //jemand darf ein Auto gefälligst erst bauen, wenn er dessen //Daten weiß. } double getMasse(){ return masse; } double getAnzahlSitzplaetze(){ return anzahlSitzplaetze; } };
-
Das heisst also die daten werdem im Konstruktor übergeben? Nur wenn die Übergabe erfolgt kann ein solches Objekt erst generiert werden?
-
nadine.wolken schrieb:
Das heisst also die daten werdem im Konstruktor übergeben? Nur wenn die Übergabe erfolgt kann ein solches Objekt erst generiert werden?
Ja, das wäre die saubere Lösung.
Objekte versprechen, daß sie korrekt initialisiert wurden.Dann gibt es auch keine Frage, ob die Daten alle da sind. Sie sind da.
Man darf alle Methoden aufrufen, weil das Objekt vollständig lebt.Entsprechend fragt man auch nicht, ob ein Klassenobjekt lebt. Wenn es existiert, dann lebt es. Dann wurde es korrekt initialisiert.
Im Zusammenhang mit Zeigern kann man fragen, ob der Zeiger auf ein existierenden Objekt zeigt oder auf NULL, wo kein Objekt wohnen darf.
-
Vielen Dank volkard :). Wenn du das gerade ansprichst mit NULL und Objekten, wie sieht das mit structs eigentlich aus wenn nein Objekt von einem struct erzeugt wurde kann man ja nicht die Abfrage != NULL machen. Wie sieht es dort aus?
-
volkard schrieb:
Jester schrieb:
Gute Idee, aber wie fragt man ab, ob die bool-Variablen korrekt gesetzt worden sind?
Man erzwingt einfach, daß sie korrekzt gesetzt wurden. Dafür ist der Konstruktor da.
oder eben doch ein "bool masseGesetztGesetzt"?

-
Ähm,
structist praktisch dasselbe wieclass! (Bis auf die default-access-specifier)
-
@Sone: aber man kann die Abfrage != NULL mit structs nicht machen.
-
nadine.wolken schrieb:
@Sone: aber man kann die Abfrage != NULL mit structs nicht machen.
Ähm, Nadine,

Diese Abfrage sollst du eigentlich nur bei Zeigern anwenden*.
Und technisch gesehen kannst du das auch nur bei skalaren Typen (int,float,char, Zeiger, .....), solangeNULLeben einfach 0 ist.Das geht also bei Klassen, egal mit welchem class-key deklariert, nicht.
Wie bereits alle anderen gesagt haben, muss man das ganz anders angehen.
~*In C++11 ist es auch nicht NULL sondern nullptr.~
-
P.S.: Das ist alles unter dem Konzept RAII bekannt.
-
Dieser Beitrag richtet sich an nadine.wolken, auch wenn ich Sone zitiere:
Sone schrieb:
Diese Abfrage sollst du eigentlich nur bei Zeigern anwenden*.
Und technisch gesehen kannst du das auch nur bei skalaren Typen (int,float,char, Zeiger, .....), solangeNULLeben einfach 0 ist.Eigentlich kannst du das alles auch nicht. Zumindest nicht, wie es hier gemeint ist. Bei skalaren Typen hast du wieder zwei Probleme:
1. Es muss sowieso schon eine Initialisierung erfolgt sein, sonst wären sie nicht 0/NULL. Wieso nicht gleich richtig initialisieren?
2. Was ist, wenn 0/NULL der gewünschte Wert ist?
Bei Pointern kommt noch hinzu, dass 0 und NULL andere Bedeutung haben, als du denkst. Wenn du viele (oder überhaupt) Prüfungen auf NULL in deinem Code hast, dann ist dies fast immer ein Zeichen, dass du nach einem schlechten Buch gelernt hast, dessen Autor selber keine Ahnung hatte. Sichere Alarmzeichen sind unter anderem:Foo *foo = new Bar; if (foo == NULL) ...if (foo != NULL) delete foo;