Должен ли я использовать структуры на С++?
Разница между структурой и классом невелика в С++, в основном только члены структуры по умолчанию являются общедоступными, а члены класса - по умолчанию.
Однако я все еще использую структуры, когда мне нужны чистые структуры данных, например:
struct Rectangle {
int width;
int height;
};
Я считаю, что очень удобно работать с:
Rectangle r;
r.width = 20;
r.height = 10;
Однако структуры данных связаны с процедурным программированием, и я занимаюсь объектно-ориентированным программированием. Это плохая идея ввести эту концепцию в OO?
Ответы
Ответ 1
Нет. Если имеет смысл использовать какую-либо структуру где-нибудь, почему вы усложняете вещи, используя что-то еще, что не предназначено для этой цели?
В моих проектах я обычно использую struct
для простых "структур", которые просто должны содержать некоторые тривиальные данные.
Если структура данных должна иметь некоторые "умности" и скрытые поля/методы, то она становится классом.
Ответ 2
Структуры особенно полезны для инкапсуляции POD (простые старые данные). Это гораздо больше по сравнению с struct vs class в С++
Ответ 3
По-моему, нет, это неплохая идея. Если вы собираетесь использовать класс таким же образом, как
class Rectangle {
public:
int width;
int height;
};
то вы также можете использовать struct
. Это поможет убедиться, что вы не забываете объявить что-либо публичным, и если вы сохраните его согласованно, то будущие разработчики (в том числе и будущие) будут знать, что вы намеревались это исключительно как объект данных, а не что-то, чтобы иметь методы внутри.
Это по-прежнему очень важный объект из всех перспектив использования, поэтому нет, он не противоречит дизайну OO.
Ответ 4
Если ваше приложение нуждается в нем, используйте его. Если ваш дизайн требует, чтобы у вас были только публичные члены, вы можете использовать struct
самостоятельно...
Ответ 5
Я использую structs все время для таких объектов, как unary_function
и т.д. На самом деле нет смысла явно объявлять public
для класса с помощью только метода operator()
. Кроме того, это не похоже на то, что вы приглашаете его наследовать.
Ответ 6
Иногда использование классов с конструкторами будет менее эффективным, чем использование структур, особенно при копировании больших объемов данных вокруг массивов. Причина заключается в том, что вы можете безопасно использовать такие функции, как memcpy, для перемещения больших блоков данных вокруг места, тогда как с классом у вас больше шансов использовать итератор и/или копировальный конструктор.
См. предыдущий вопрос предыдущий вопрос для дальнейшего обсуждения этого вопроса.
Ответ 7
Похоже, у вас есть Ferrari Scaglietti и Lamborgini Espada, когда-нибудь вы водите Ferarri, когда-нибудь вы управляете Lamborghini....
Когда-нибудь вы используете struct, когда-нибудь вы используете класс, есть ли что-то истинное и ложное?
Ответ 8
Нет ничего плохого в использовании структуры на С++, я стараюсь избегать использования классов, если у меня нет достаточного времени для планирования того, что их цель должна быть.
Ответ 9
Я бы предпочел структурированный класс. Первая причина заключается в том, чтобы избежать неинициализированной структуры. Другая причина заключается в том, что вы всегда сможете добавлять любые удобные методы в структуру, если хотите.
Ответ 10
Я делал следующее:
struct Interface
{
virtual ~Interface() {}
virtual void foo() = 0;
};
class Implementation : public Interface
{
void foo(); // or public, it depends.
public:
Implementation(...);
};
поскольку по умолчанию интерфейс имеет все свои члены public, и по умолчанию реализации имеют свои члены private.