С++ для начинающих



         

Объединение – класс, экономящий память - часть 4


class Token {

public:

   TokenKind tok;

   // имя типа объединения опущено

   union {

      char _cval;

      int _ival;

      char *_sval;

      double _dval;

   } val;

};

Существует анонимное объединение – объединение без имени, за которым не следует определение объекта. Вот, например, определение класса Token, содержащее анонимное объединение:

class Token {

public:

   TokenKind tok;

   // анонимное объединение

   union {

      char _cval;

      int _ival;

      char *_sval;

      double _dval;

   };

};

К данным-членам анонимного объединения можно напрямую обращаться в той области видимости, в которой оно определено. Перепишем функцию lex(), используя предыдущее определение:

int lex() {

   Token curToken;

   char *curString;

   int curIval;

   // ... выяснить, что находится в лексеме

   // ... затем установить curToken

   case ID:

      curToken.tok = ID;

      curToken._sval = curString;

      break;

   case Constant:   // целая константа

      curToken.tok = Constant;

      curToken._ival = curIval;

      break;

   // ... и т.д.

}

Анонимное объединение позволяет убрать один уровень доступа, поскольку обращение к его членам идет как к членам класса Token. У него не может быть закрытых или защищенных членов, а также функций-членов. Такое объединение, определенное в глобальной области видимости, должно быть объявлено в безымянном пространстве имен или иметь модификатор static.




Содержание  Назад  Вперед