Главная » Программирование звука » Совершенствование C: улучшенная конструкция struct

0

Самой   очевидной   новой   особенностью   C++   является   конструкция   class. Конструкция  class в  C++   это  почти  то  же  самое,  что  struct,  поэтому  я  на некоторое  время отвлекусь  от  новой  формы  записи и  объясню, как же  C++  улучшает конструкцию struct.

Даже   если   вы   не   интересовались   объектно-ориентированным   программиро-

ванием, вы, вероятно, раз или два использовали конструкцию struct в C. Она

удобна,  так  как  предоставляет  вам  возможность  ссылаться  на  некоторый  набор взаимосвязанных  данных  по  одному  имени.  Предположим,  например,  что  вам  необходимо управлять буфером символов.

Для  буфера  требуются  по  крайней  мере  три  блока  данных:  вам  нужны  указатели  на  начало  и  конец  данных,  а  также  участок  в  памяти  для  хранения  данных. Поскольку  буфер   это  одна  абстрактная  единица,  удобно  описать  одну  конструкцию struct для хранения всех данных, например, так:

struct Buffer { char *_begin; char *_end;

char _data[256];

};

Я  выбрал  способ  записи,  при  котором  все  имена  членов  Buffer предваряют-

ся символом подчеркивания.

Даже  на  этом  начальном  уровне  C++  дает  некоторые  возможности,  «облегчающие  жизнь».  Первая   C++  автоматически  делает  имя  Buffer именем  типа. Вместо  определения переменной  в  виде  struct Buffer myBuff,  как вам  пришлось бы сделать в С, вы можете просто написать Buffer myBuff. Вторая C++ облегчает  создание  новой  переменной  типа  Buffer в  куче.  Bo  избежание  возни с  malloc(),  sizeof и  преобразованиями  типов  C++  позволяет  написать  new Buffer.  Результатом  будет  указатель  на  новую  переменную  типа  Buffer.  Когда вы  закончите  работу  с  переменной  Buffer,  вы  можете  использовать  оператор delete для  того,  чтобы  избавиться  от  нее.  (Небольшое  предупреждение:  хотя функции  malloc/free все  еще  работают  в  C++,  никогда  не  следует  смешивать их с new/delete.)

Вот небольшой пример, иллюстрирующий это:

Buffer myBuff     /* Буфер в  стеке. */ myBuff._begin = myBuff._data; myBuff._end = myBuff._data;

Buffer *pBuff= new Buffer /* Буфер в  куче. */

pBuff->_begin = pBuff->_data;

pBuff->_end = pBuff->_data;

/* Работаем с  pBuff и  myBuff */

delete pBuff;      /* Удаляем буфер из  кучи. */

Заметим,  что операторы -> и .  используются  для доступа к членам  точно  так же, как и в C. Обратите внимание на то, что C++ позволяет вам объявлять новые переменные в любом месте программы, а не только в начале блока.

B  этом  примере  я  проинициализировал  новые  переменные  типа  Buffer,  задав  значения _begin и _end так,  чтобы  они указывали  на  соответствующие данные. Очевидно, что мне необходимо делать это каждый раз, когда я создаю новую переменную типа Buffer.

C++  позволяет  сделать  это  чрезвычайно  просто.  Когда  вы  создаете  новую  переменную  типа  struct,  C++  автоматически  вызывает  для  нее  конструктор.  Вот мое определение структуры Buffer c конструктором:

struct Buffer { char *_begin; char *_end;

char _data[256];

Buffer() { _begin = _data; _end = _data; };

};

Конструктор это часть структуры, похожей на функцию. Когда вы объявляете новую переменную строкой Buffer myBuff или выделяете память для новой переменной командой new Buffer, компилятор автоматически будет вызывать конструктор (который носит то же имя, что и сама структура struct). Обычные правила видимости в стиле C применимы и здесь. Имя _begin это часть структуры Buffer. Так как конструктор определен внутри struct, он может видеть и использовать эти имена. Я подробнее объясню это положение чуть позднее.

Теперь, если вы хотите работать с типом Buffer, вы просто создаете перемен-

ную этого типа и используете ее:

Buffer myBuff;           // Создание  и  инициализация  буфера.

*myBuff._end++ = "а";    // Помещаем   в  буфер символ "а".

Обратите внимание на то, что // в C++ означает комментарий. (Старый стиль для комментариев C /*Комментарий*/ все еще работает.)

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии