Всегда ли зло иметь структуру с методами?
Я только просматривал и заметил следующее...
Когда вы должны использовать класс vs struct в С++?
Консенсус в том, что, по соглашению, вы должны использовать только конструкцию для POD, никаких методов и т.д.
Я всегда чувствовал, что некоторые типы были естественными структурами, а не классами, но все же могут содержать несколько вспомогательных функций в качестве членов. Структура должна по-прежнему быть POD большинством обычных правил - в частности, она должна быть безопасной для копирования с использованием memcpy. Он должен иметь все данные участника публично. Но мне все же имеет смысл иметь вспомогательные функции в качестве членов. Я даже не буду возражать против частного метода, хотя я не помню, чтобы когда-либо делал это сам. И хотя он нарушает обычные правила POD, я бы не стал возражать против структуры, имеющей конструкторы, при условии, что они были просто инициализированными конструкциями с несколькими полями (переопределение назначения или деструкторы, безусловно, было бы против правил).
Для меня структура представляет собой интуитивно набор полей - структуру данных node или что-то еще, тогда как класс является абстракцией. Логическое место размещения вспомогательных функций для ваших коллекций полей может быть в пределах структуры.
Я даже думаю, что однажды прочитал несколько советов, но я не помню, где.
Это противоречит принятой лучшей практике?
EDIT - POD (Обычные старые данные) искажается этим вопросом. В частности, структура может быть не-POD чисто, потому что элемент не является POD - например. совокупность с элементом типа std::string. Этот агрегат нельзя копировать с помощью memcpy. В случае путаницы см. здесь.
Ответы
Ответ 1
Для того, что стоит, все стандартные функции STL определяются как структуры, и их единственная цель - иметь функции-члены; Функторы STL не должны иметь состояние.
EDIT: Лично я использую struct
всякий раз, когда у класса есть все публичные члены. Это имеет мало значения, если вы согласны.
Ответ 2
Что касается языка, это не имеет значения, за исключением доступа по умолчанию private
vs. public
. Выбор субъективен.
Я лично сказал бы использовать struct
для POD, но помните, что "POD" не означает "никакие функции-члены". Это означает отсутствие виртуальных функций, конструкторов, деструкторов или operator=
.
Изменить: я также использую struct
для простых public
-агрегированных данных, даже если их члены не являются POD.
Ответ 3
Я часто использую struct
.
Для "традиционных" классов ООП (те, которые представляют конкретную "вещь" ) я обычно использую class
просто потому, что это обычное соглашение.
Но большинство моих классов не являются объектами ООП. Они, как правило, являются функторами, а также классами признаков и всеми другими концепциями абстрактного кода, которые я использую для выражения себя, а не моделированием конкретных "вещей". И я обычно делаю struct
. Это избавляет меня от необходимости вводить начальный public:
, и поэтому определение класса становится короче и легче получить обзор.
Я также склоняюсь к созданию более крупных, более сложных классов class
. За исключением того, что это редко затрагивает что-либо, потому что я больше склоняюсь к рефакторингу больших, сложных классов... И тогда у меня останутся небольшие простые, которые могут быть сделаны struct
.
Но в любом случае я никогда не буду считать это "злым". "Зло" - это когда вы делаете то, что активно запутывает ваш код, или когда вы делаете что-то гораздо более сложное, чем необходимо.
Но каждый программист на С++ знает, что struct
и class
означает практически одно и то же. Вы не будете путаться долго, потому что видите struct Animal {...};
Вы знаете, что это класс, предназначенный для моделирования животного. Так что нет, это не "зло", независимо от того, как вы это делаете.
Ответ 4
Когда я контролирую руководства по стилю, все определяется как struct
. Исторически я хотел, чтобы все мои объекты были такими или другими, так как меня учили, что поведение undefined пересылает объявленную структуру как класс, и наоборот (я не уверен, действительно ли это действительно так, только то, что мне сказали). И действительно, struct
имеет более разумное состояние по умолчанию.
Я по-прежнему делаю то же самое, потому что я никогда не был уверен в ценности использования его в качестве формы документации. Если вам нужно сообщить, что объект имеет только публичные элементы или не имеет каких-либо функций-членов или какую-либо произвольную строку, которую вы выбрали, между ними есть фактическая документация. Поскольку вы никогда не используете ключевое слово struct
или class
при использовании этого типа, вам нужно будет искать определение в любом случае, если вы хотите получить информацию. И со всеми, кто имеет собственное мнение о том, что на самом деле означает struct
, его полезность в качестве самостоятельной документации снижается. Поэтому я стреляю по последовательности: все как одно или другое. В этом случае struct
.
Это не популярный способ делать что-либо, мягко говоря. К счастью для всех участников, я очень редко контролирую стандарты кодирования.
Ответ 5
Я использую struct
всякий раз, когда мне нужна совокупность членов данных public
(в отличие от class
), которую я использую для типов, которые поставляются с определенным уровнем абстракций и имеют свои данные private
).
Независимо от того, имеет ли такой агрегат данных функции-члены для меня неважно. Фактически, я редко когда-либо пишу struct
, не предоставляя по крайней мере одного его конструктора.
Ответ 6
Вы сказали: "Для меня структура представляет собой интуитивно набор полей - структуру данных node или что-то еще". То, что вы описываете, Обычные старые данные. В стандарте С++ есть мнение о том, что POD означает в отношении функций языка С++. Я предлагаю, чтобы, по возможности, вы принимали значение POD, используемое в С++ 0x.
Мне нужно найти ссылку для этого, но я думал, что в отношении определения типов ключевые слова "struct" и "class" должны быть синонимами в С++ 0x. Единственное различие заключается в том, что класс по умолчанию относится к частным членам, а структура по умолчанию - к публике. Это означает, что вы никогда не увидите сообщения об ошибках, такие как "Тип X, впервые увиденный с помощью структуры, теперь видимой с помощью класса". когда мы все используем С++ 0x.
Я думаю, что неправильно иметь строгие правила о том, когда использовать класс и когда использовать struct. Если последовательность важна для вас, продолжайте и создайте стандарт кодирования, в котором есть какие-либо правила, которые вам нравятся. Просто убедитесь, что все знают, что ваш стандарт кодирования относится к тому, как вы хотите, чтобы код выглядел - он вообще не относится к основным языковым функциям.
Возможно, чтобы привести пример, когда я нарушаю все ваши правила, вы говорите: "Для меня структура представляет собой интуитивно набор полей - структуру данных node или что-то еще, тогда как класс является абстракцией". Когда я хочу написать класс, который реализует некоторую абстракцию, я определяю интерфейс как структуру с чистыми виртуальными методами (egad!) - это отображается в заголовке, также как и метод factory для построения моего конкретного класса. Конкретный класс вообще не подвергается публичному заголовку. Поскольку конкретный класс является секретом, он может быть реализован, но мне нравится, и он не имеет никакого отношения к внешнему коду.
Я бы предположил, что если вы считаете, что ключевые слова struct и class имеют какое-либо отношение к концепции POD, то вы еще не понимаете С++.