Подтвердить что ты не робот

Всегда ли зло иметь структуру с методами?

Я только просматривал и заметил следующее...

Когда вы должны использовать класс vs struct в С++?

Консенсус в том, что, по соглашению, вы должны использовать только конструкцию для POD, никаких методов и т.д.

Я всегда чувствовал, что некоторые типы были естественными структурами, а не классами, но все же могут содержать несколько вспомогательных функций в качестве членов. Структура должна по-прежнему быть POD большинством обычных правил - в частности, она должна быть безопасной для копирования с использованием memcpy. Он должен иметь все данные участника публично. Но мне все же имеет смысл иметь вспомогательные функции в качестве членов. Я даже не буду возражать против частного метода, хотя я не помню, чтобы когда-либо делал это сам. И хотя он нарушает обычные правила POD, я бы не стал возражать против структуры, имеющей конструкторы, при условии, что они были просто инициализированными конструкциями с несколькими полями (переопределение назначения или деструкторы, безусловно, было бы против правил).

Для меня структура представляет собой интуитивно набор полей - структуру данных node или что-то еще, тогда как класс является абстракцией. Логическое место размещения вспомогательных функций для ваших коллекций полей может быть в пределах структуры.

Я даже думаю, что однажды прочитал несколько советов, но я не помню, где.

Это противоречит принятой лучшей практике?

EDIT - POD (Обычные старые данные) искажается этим вопросом. В частности, структура может быть не-POD чисто, потому что элемент не является POD - например. совокупность с элементом типа std::string. Этот агрегат нельзя копировать с помощью memcpy. В случае путаницы см. здесь.

4b9b3361

Ответ 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, то вы еще не понимаете С++.