Logik Problem: Vermeidung von if Abfragen
-
Ich wollts halt als struct haben, wobei jede Farbe von nem bool Wert repräsentiert wird.
-
Logigproblem schrieb:
Ich wollts halt als struct haben, wobei jede Farbe von nem bool Wert repräsentiert wird.
das ging wahrscheinlich an Sebastian Pizer ^^
bb
-
FreakY<3Cpp schrieb:
Darf ich mal fragen, warum du eigentlich kein Enum benutzt?
Aus keinem besonderen Grund. Es war eher eine Laune. Es gibt mit
enums einen Vorteil aber auch einen Nachteil:
+ mehr Typsicherheit
- expliziter Cast nötig wenn man "Flags" zusammensetzt// Sei farbe_t ein enum // Beachte den notwendigen Cast: farbe_t objekt = farbe_t( blue | red );Denn der Ausdruck
blue|redist vom Typint, welcher sich nicht direkt einemenumzuweisen lässt. Das kann dann schon mal nerven.Gruß,
SP
-
Sebastian Pizer schrieb:
FreakY<3Cpp schrieb:
Darf ich mal fragen, warum du eigentlich kein Enum benutzt?
Denn der Ausdruck
blue|redist vom Typint, welcher sich nicht direkt einemenumzuweisen lässt. Das kann dann schon mal nerven.Achso, noch etwas: Die "Bit-Operatoren" (in diesem Fall: & | ~) sind nicht wirklich portabel bei vorzeichenbehafteten Ganzzahlen wie
int.assert( ~(-1) == 0); // gilt nicht auf jeder Maschine // nur bei denen, die das Zweierkomplement benutzenGruß,
SP
-
Weiß nicht, ob das erlaubt ist, aber man könnte die Operatoren ja für das
enumüberladen.inline Color operator | (Color left, Color right) { return static_cast <Color> (static_cast<int>(left) | right); }
-
Don06 schrieb:
Weiß nicht, ob das erlaubt ist, aber man könnte die Operatoren ja für das
enumüberladen.Ja, das ist erlaubt.
Gruß,
SP
-
Der Code von l'abra d'or funtkioniert einwandfrei! DANKE

-
Sebastian Pizer schrieb:
Aus keinem besonderen Grund. Es war eher eine Laune. Es gibt mit
enums einen Vorteil aber auch einen Nachteil:
+ mehr Typsicherheit
- expliziter Cast nötig wenn man "Flags" zusammensetztDu könntest zunächst bloß deine selbstgebastelte
unsigned const-Aufzählung in einenumändern und den Rest einfach so lassen.
-
Logigproblem schrieb:
Der Code von l'abra d'or funtkioniert einwandfrei! DANKE

Der Code von Sebastian Pizer ist aber viel kürzer.
Will auch noch meinen Senf dazugeben:
Wenn die Farben definiert sind alsenum Color { blue = 1, green = 2, black = 4, red = 8, white = 16 };dann kannst du eine Bedingung folgendermaßen erstellen:
Color condition = Color(black | white | blue);Die Überprüfung geht dann so:
if(condition | object == condition) // Wenn in condition keine Bits gesetzt sind, die nicht auch in condition gesetzt sind Farbe erfüllt die BedingungDamit ist das Portabilitätsproblem von Sebastian Pizer auch erledigt.
-
@Michael E.: Perfect!

Naja, strenggenommen benutzt Du die Bitweise-Oder-Verknüpfung immer noch auf
intund nichtunsigned int. Aber die Zahlen, mit denen da hantiert wird, sind ja eh nicht negativ und die Bitmuster für Zahlen 0...32767 müssten dann alle gleich sein, egal ob die Maschine Zweierkomplement, Einerkomplement oder Sign-Magnitude als binäre Repräsentierung nutzt. Ich weiß jetzt gerade nicht, ob C++ noch etwas anderes zulässt. Wenn ja, könnte es sein, dass es immer noch nicht 100% portabel (vermute aber mal, dass es das ist).Gruß,
SP