Всегда ли плохо иметь структуру с методами? - PullRequest
22 голосов
/ 01 августа 2010

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

Когда вы должны использовать класс против структуры в C ++?

Все согласны с тем, что по соглашению вы должны использовать struct только для POD, без методов и т. Д.

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

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

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

Это противоречит общепринятой практике?

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

Ответы [ 6 ]

20 голосов
/ 01 августа 2010

Для чего бы это ни стоило, все стандартные функторы STL определены как структуры, и их единственная цель - иметь функции-члены; Функторы STL не должны иметь состояния.

РЕДАКТИРОВАТЬ: Лично я использую struct всякий раз, когда у класса есть все открытые члены. Это не имеет большого значения, если вы последовательны.

10 голосов
/ 01 августа 2010

Что касается языка, это не имеет значения, за исключением private по умолчанию против public доступа.Выбор субъективен.

Я бы лично сказал, использовать struct для POD, но помните, что «POD» не означает «нет функций-членов».Это означает отсутствие виртуальных функций, конструкторов, деструкторов или operator=.

Редактировать: я также использую struct s для простых public -сходов доступа к данным, даже еслиучастники не PODы.

5 голосов
/ 01 августа 2010

Я склонен использовать struct много.

Для «традиционных» ООП-классов (тех, которые представляют определенную «вещь») я склонен использовать class просто потому, что это общее соглашение.

Но большинство моих классов не являются объектами ООП. Они, как правило, являются функторами и чертят классы и все другие более абстрактные концепции кода, вещи, которые я использую, чтобы выразить себя , вместо того, чтобы моделировать конкретные "вещи". И те, которые я обычно делаю struct. Это избавляет меня от необходимости вводить начальный public:, и поэтому делает определение класса короче и легче получить обзор.

Я также склоняюсь к созданию более крупных и сложных классов class. За исключением того, что это редко влияет на что-либо, потому что я еще больше склоняюсь к рефакторингу больших, сложных классов ... А потом у меня остаются маленькие простые, которые могут быть сделаны struct.

Но в любом случае я бы никогда не посчитал это "злом". «Зло» - это когда вы делаете что-то, что активно запутывает ваш код, или когда вы делаете что-то гораздо более сложное, чем необходимо.

Но каждый программист C ++ знает, что struct и class означают практически одно и то же. Вы не будете долго путаться, потому что видите struct Animal {...};. Вы знаете, что это класс, предназначенный для моделирования животного. Так что нет, это не «зло», независимо от того, как ты это делаешь.

3 голосов
/ 01 августа 2010

Когда я контролирую руководства по стилям, все определяется как struct.Исторически я хотел, чтобы все мои объекты были теми или иными, так как меня учили, что неадекватное поведение заключается в том, чтобы перенаправлять объявление структуры как класса, и наоборот (я не уверен, что это когда-либо было действительно так, простоМне сказали).И действительно, struct имеет более разумное состояние по умолчанию.

Я все еще делаю то же самое, потому что я никогда не был убежден в ценности использования его как формы документации.Если вам нужно передать, что у объекта есть только открытые члены, или у него нет каких-либо функций-членов, или какая-либо произвольная линия, которую вы выбрали провести между ними, у вас есть фактическая документация, доступная для этого.Поскольку при использовании типа вы на самом деле не используете ключевое слово struct или class, вам все равно придется искать определение, если вам нужна информация.А так как каждый имеет свое собственное мнение о том, что на самом деле означает struct, его полезность в качестве самодокументирования снижается.Поэтому я стреляю для последовательности: все как один или другой.В этом случае struct.

Это, по меньшей мере, не популярный способ ведения дел.К счастью для всех участников, я очень редко контролирую стандарты кодирования.

2 голосов
/ 01 августа 2010

Я использую struct всякий раз, когда мне нужен агрегат public членов данных (в отличие от class, который я использую для типов, которые имеют определенный уровень абстракций и имеют свои данные private).

Не имеет значения, имеет ли такой агрегат данных функции-члены.На самом деле, я редко пишу struct, не предоставляя для этого хотя бы одного конструктора.

0 голосов
/ 01 августа 2010

Вы сказали: «Для меня структура - это интуитивно понятная совокупность полей - узел структуры данных или что-то еще».То, что вы описываете, это Обычные старые данные .Стандарт C ++ имеет мнение о том, что означает POD в отношении возможностей языка C ++.Я полагаю, что, где это возможно, вы принимаете значение POD, используемое в C ++ 0x .

Мне нужно найти ссылку на это, но я подумал, что в отношении типачто касается определений, ключевые слова "struct" и "class" должны быть синонимами в C ++ 0x.Единственное отличие состоит в том, что класс по умолчанию имеет закрытые члены, а структура по умолчанию - public.Это означает, что вы никогда не увидите сообщения об ошибках компилятора, такие как «Тип X, впервые увиденный с использованием struct, теперь видимый с использованием класса».как только мы все используем C ++ 0x.

, я думаю, что неправильно иметь строгие правила о том, когда использовать класс, а когда использовать struct.Если для вас важна согласованность, сделайте стандарт кодирования, в котором есть какие-то правила, которые вам нравятся.Просто убедитесь, что все знают, что ваш стандарт кодирования связан с тем, как вы хотите, чтобы ваш код выглядел - он вообще не имеет отношения к базовым языковым возможностям.

Может быть, приведу пример, где я нарушаю все ваши правила,Вы говорите: «Для меня структура - это интуитивно набор полей - узел структуры данных или что-то еще, тогда как класс - это абстракция».Когда я хочу написать класс, который реализует некоторую абстракцию, я определяю интерфейс как структуру с чисто виртуальными методами (например,!) - это раскрывается в заголовке, так же как и фабричный метод для создания моего конкретного класса.Конкретный класс вообще не выставляется в публичном заголовке.Поскольку конкретный класс является секретом, он может быть реализован так, как мне нравится, и для внешнего кода это не имеет значения.

Я бы предложил, если вы думаете, что ключевые слова struct и class имеют какое-либо отношение к концепцииPOD, тогда вы еще не понимаете C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...