Funktion zur Überprüfung der Setzung
-
Im Regelfall überlegst Du Dir, was die sogenannte Invariante Deiner Klasse ist. Also der Zustand, der immer gegeben ist, damit es sich um eine gültige Instanz handelt. Dann implementierst Du Deine Klasse derart, dass die Invariante bei neuen Objekten gegeben ist, und im Folgenden nicht durch Methoden verletzt wird.
Die Invariante kannst Du ggf. auf Gültigkeit überprüfen. Ist u.U. sinnvoll - und schadet nicht.
-
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)!

nadine.wolken schrieb:
wie kann man am Besten eine Funktion erstellen, die dazu dient zu überprüfen ob alle Variablen einer Klasse anhand von Set-Methoden gesetzt wurden?
Das klingt nach dem XY-Problem (siehe Signatur).
Daher beschreibe mal deine Klasse, und wieso genau du das (angeblich!) brauchst.
-
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.~