Ta sztuczka pewnie jest znana większości z Was, ale myślę, że i tak warto o niej wspomnieć:
namespace LightTypes
{
enum ELightTypes
{
Point,
Spot,
Sun
};
};
typedef LightTypes::ELightTypes LightType;
Co dzięki takiej definicji enuma zyskujemy?
- poszczególne wyliczenia nie wchodzą w konflikty i nie zaśmiecają globalnej przestrzeni nazw
- możemy liczyć na podpowiedzi ze strony naszego IDE, gdy napiszemy LightTypes::
- jesteśmy zgodni ze standardem C++ (MSVC++ dopuszcza na przykład enum w klasie, do którego odwołujemy się NazwaKlasy::NazwaEnuma, ale jednocześnie dostajemy "brzydki" warning o użyciu rozszerzenia C++)
Trzeba tylko pamiętać, że chociaż typem zmiennej będzie LightType, to jej wartością może być np. LightTypes::Spot (nie mylić z LightType::Spot). Dlaczego? Patrz trzeci punkt powyżej.
Jako ciekawostka, w C++0x ma pojawić się twór określany mianem enum class, rozwiązujący problem z zakresami ważności.
Comments:
-
Sugeruje tylko zmienic troche __ELightTypes. W C+ nazwy zaczynajace sie od podwojnego podkreslenia sa zastrzezone dla kompilatora.
12.05.2009 16:22:24
-
Dzięki za uwagę, a mógłbyś podać źródło? Bo znalazłem tylko takie wzmianki:
http://support.microsoft.com/kb/98841
http://flash-gordon.me.uk/ansi.c.txt (4.1.2)12.05.2009 17:10:03
-
Zrodlem jest standard C+ , ktorego oficjalnie na sieci nie ma :) Numerki nie musza zgadzac sie z draftem.
http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
Teraz zreszta nadal jest zle, bo pojedyncze podkreslenie i duza litera tez jest zastrzezone :)14.05.2009 10:27:52
-
Z tego źródła praktycznie wynika, że dla świętego spokoju lepiej wcale nie używać podkreśleń, bo jeśli nie teraz to w przyszłości mogą być problemy :)
14.05.2009 10:44:41
-
Wygląda na to, że Riddle ma rację.
Dzięki za zwrócenie uwagi, yarpen. :)
Szkoda, że kompilator nie zwraca na takie rzeczy uwagi (w sensie warnów).
Chociaż tak naprawdę przy programowaniu w WinAPI nie trzeba dużo, żeby wpaść w konflikt.
Wystarczy mieć funkcję Foo::GetObject() (zła nazwa?), albo nazwać zmienną near.14.05.2009 13:44:50
-
Reg:
Fajny pomysł z tym enumem. Chociaż ja żeby nie kombinować pozostanę przy tradycyjnym:
class Light {
...
enum TYPE { TYPE_POINT, TYPE_SPOT, TYPE_DIRECTIONAL, TYPE_COUNT };
};
MyLight->SetType(Light::TYPE_POINT);17.05.2009 15:47:07