Bit İşlemleri bölümünde "Bayraklar" başlığı altında bir şeyler var:
http://ddili.org/ders/d/bit_islemleri.html
Üç bayraktan yalnızca birisinin kullanıldığını ancak sen denetleyebilirsin. Mikroişlemci (ve dolayısıyla dil) böyle bir destek vermiyor.
Burada farklı bir tasarım düşünmek daha doğru olabilir. O üç değer hangi kavramı temsil ediyorsa o kavram için bir enum tanımlanır ve işlev onu farklı bir parametre olarak alır:
enum Sıcaklık { soğuk, ılık, sıcak }
void foo(Sıcaklık s);
Programcı isterse yine de bunu yanlış kullanabilir:
foo(Sıcaklık.ılık + Sıcaklık.sıcak); // HATA
O kadarına enum'la engel olamayız. Daha da sağlam olmasını istersek bu kavramı temsil eden bir yapı tanımlar ve bu yapının üç nesnesini kendi modülümüzde oluştururuz:
struct Sıcaklık
{
private: // Burada herşey korumalı. Modülden başkasını ilgilendirmiyor
// Yine bir enum
enum SıcaklıkDerecesi { soğuk, ılık, sıcak }
SıcaklıkDerecesi derece;
}
// Kullanıcılar bu üç nesneden birisini kullanacaklar
Sıcaklık soğuk = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.soğuk);
Sıcaklık ılık = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.ılık);
Sıcaklık sıcak = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.sıcak);
void foo(Sıcaklık s)
{
if (s == soğuk) {
// ...
}
}
Kullanıcı kodu artık toplama gibi saçma işlemler uygulayamaz:
// Kullanıcılar normalde bunu 'ılık' diye yazmazlar da modülün adıyla
// benimModül.ılık diye yazarlar. Bu örnekte herşey aynı modülde
// olduğundan çalışabiliyor.
foo(ılık);
foo(sıcak);
// foo(ılık + sıcak); // Sıcaklık yapısının toplama işlemi
// tanımlanmadığından bu şimdi bir derleme hatasıdır.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]