Единственные методы, которые мне нравятся в структурах, - это методы типа свойств, простые преобразования (и, при необходимости, для типа, операторы) и конструкторы не по умолчанию.
Свойства
Например, я мог бы определить структуру RECT
, как показано ниже:
typedef struct tagRECT{
int left;
int top;
int right;
int bottom;
int get_width(){return right - left;}
int get_height(){return bottom - top;}
int set_width(int width){right = left + width; return width;}
int set_height(int height){bottom = top + height; return height;}
} RECT, *PRECT;
Методы "set" возвращают новое значение для поддержки цепочки присваивания в случае, если компилятор поддерживает свойства как расширение.
Простые преобразования
Для типов POD, которые хранят сложные данные, я мог бы включить методы, которые выполняют простые преобразования этих данных. Очевидным примером могут быть методы Rotate, Scale, Shear и Translate в структуре TransformationMatrix.
Операторы
Действительно, просто расширение вышеупомянутого, если операторы имеют смысл для типа, я добавлю их в структуру. Это может быть целесообразным и необходимым для поддержания атомарности объекта. Очевидным примером являются стандартные арифметические операторы на сложной структуре.
Конструкторы
Я предпочитаю , а не , чтобы в моих структурах был конструктор по умолчанию. Я не хочу выделять массив POD и страдать от вызова тысячи (или чего-то еще) инициализаций по умолчанию. Если memset
инициализации будет недостаточно, я предоставлю метод Initialize.
Однако я предоставлю конструктор не по умолчанию для структур. Это особенно полезно, когда одно или несколько полей могут быть выведены из частичного построения.