static enum wewnarz klasy

0

Witam,

Pytanie jest takie - czy standard C++ na to pozwala? Spotkalem sie z tym kilka razy, ze ktos deklaruje enum jako static wewnatrz klasy i podobno kompilatory MS to przepuszczaja.

JA nie mam pod reka zadnego Visuala, ale ani GCC ani Borladn na to nie pozwalaja.

0

test:
VS2005 - zezwala
VC2008EE - zezwala

Ale po jakie licho taki twór ? Jakie ten enum ma mieć właściwości ?

0

No wlasnie nie wiem, zawsze myslalem że:

enum TEST {test1,
           test2};

To jest to samo co:

static const int test1=0;
static const int test2=1

ale static enum? hmm

Tutaj na przyklad ktos uzywa static enum: http://www.codeguru.com/Cpp/Cpp/cpp_mfc/article.php/c4067

Tyle ze ja jakos nie rozumiem co dalo tam to slowko static, przeciez zmienna i tak nie bedzie widoczna w innych plikach cpp, wiec nie wiem o co chodzi?

Oczywiscie, jezeli bedzie cos takiego:


class A
{
 public:
   enum TEST {test1,
                    test2};
   
   static const int test3=0;
   
   void foo(void);
  
};

To:

  
void A:foo(void)
 {
   test1;            //Dozwolone
   TEST(test1);  //Dozwolone
   test3;           //Dozwolone

 }

Ale wewnatrz innej klasy:

 A obiekt;
 
 A::test1;      //Dozwolone
 obiekt.test1; //Dozwolone
 A::test3;     //Dozwolone
 obiekt.test3; //Dozwolone

 //ale:
 obiekt.TEST(test1);  //Niedowzwolone
 A::TEST(test1);       //Niedozwolone

No chyba ze w tym przypadku static enum cos zmieni?

0

Wartości enum nie są stałymi w sensie zmiennej const tylko w sensie "const expression" czyli są znane zawsze i tylko podczas kompilacji, jak #define'y. W przeciwieństwie do zmiennej const nigdy nie znajdą się w pamięci, nigdy nie pobierzemy ich adresu. W tym świetle static enum jest dla mnie bez sensu.

W kodzie, do którego link dałeś jest również statyczna funkcja globalna. Dla mnie bez sensu. O co tu chodzi ? Rola tylko kosmetyczna ?

0

co do static enum -- zielony jestem..

natomiast 'static'zna globalna funkcja, ma inne znaczenie. STATIC dodany do globalnej deklaracji powoduje, ze ta nazwa nie jest eksportowana z modulu na zewnatrz. tzn. inne moduly .cpp nie beda sie z nia linkowac, bedzie ona tak jakby "prywatna" dla tego pliku .cpp. tyczy sie to zarowno deklaracji zmiennych globalnych jak i funkcji.

0

Dokladnie, dotyczy to tez zmiennych. W takich sytaucjach jezeli zmienna nie jest static a jest w dwoch modulach, to niektore linkery (jak Borland) zglaszaja ostrzezenie, a inne (jak gcc) - bład.

0

no tak.. ale ENUM to nie jest zmienna! na kij to static?

0

yyy, na pewno miałoby sens:

class A {
    static enum {a,b,c,d} pole;
};

bo tutaj mamy deklarację enuma i jednocześnie zmiennej, którą robimy statyczną. Sama deklaracja jakiegokolwiek typu jako static wydaje mi się bezsensowna. Pewnie kompilatory to łykają, żeby sobie uprościć analizę leksykalną i nic poza tym. Znaczy, po deklaracji typu można od razu wstawić zmienne, czyli np:

const class { ... } a;
volatile struct { ... } b;
static enum {...} c;

pewnie te const, static itp są zapamiętywane "na wypadek" gdyby po deklaracji pojawiła się lista zmiennych. Skoro listy nie ma, to są olewane, ale błedu jako tako nie ma.

Po co zaś to ludzie piszą... zagadka.

Ale pogrzebię w specyfikacji na wszelki wypadek...

1 użytkowników online, w tym zalogowanych: 0, gości: 1