namespace enum

11.05.2009 18:43 in c++, devblog

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:

  1. yarpen

    yarpen:

    Sugeruje tylko zmienic troche __ELightTypes. W C+ nazwy zaczynajace sie od podwojnego podkreslenia sa zastrzezone dla kompilatora.

    12.05.2009 16:22:24

  2. Tomasz Dąbrowski

    Tomasz Dąbrowski:

    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

  3. yarpen

    yarpen:

    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

  4. Riddlemaster

    Riddlemaster:

    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

  5. Tomasz Dąbrowski

    Tomasz Dąbrowski:

    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

  6. Reg

    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

Leave comment: