2010-06-29 2 views
3

Я нашел несколько методов онлайн о том, как реализовать свойства, подобные функциям, в C++. Кажется, есть некоторые хорошие рабочие места, чтобы заставить его работать хорошо.Чтобы реализовать свойства или нет?

Вопрос в том, с преобладанием свойств в управляемых языках, следует ли тратить усилия и возможность разрыва кода (или что-то еще) на реализацию свойств в моем коде?

Скажите, что я собираюсь создать библиотеку вызовов для кого-то другого, чтобы свойства были достаточно желательными, чтобы проверить дополнительный код?

ответ

4

Если вы не добавляете отражение в микс (будучи в состоянии идентифицировать во время выполнения какие свойства существуют на объекте), свойства являются не чем иным, как синтаксическим сахаром для геттеров и сеттеров. В этом случае также можно использовать геттеры и сеттеры.

Свойства с отражением действительно могут быть полезны для программ на С ++. Qt обрабатывает этот quite nicely.

+0

+1, но я бы не согласился с тем, что QT справляется с этим так хорошо. Любой может обработать отражение/интроспекцию «красиво» с помощью отдельного компилятора/препроцессора, который добавляет расширения к языку C++. – stinky472

+0

@ stinky472: Правда, но они также могут очень плохо справиться с этим. ;) Я просто думаю, что реализация Qt сама по себе хороша. – Cogwheel

9

Что вы можете получить от этого, что вы не можете получить, просто используя функции доступа? Мне кажется, что при кодировании вы должны играть на силе языка, вместо того чтобы заставить его подражать другому языку. Поэтому я не проголосовал за это. Однако, если вы пишете в MANAGED C++ и собираетесь использовать этот код для регулярного взаимодействия с C#, и если по какой-то причине вы хотите сделать бэкэнд более удобным для использования программистом на C#, это может быть полезно.

+0

Это было более просто синтаксическое в природе. В настоящее время я работаю над проектом с несколькими друзьями, которые кодируют в основном в C#, в то время как в основном я C++. Проект находится в стандартном C++, но они хватались за отсутствие свойств. – Veaviticus

+0

Одно из преимуществ чего-то вроде свойства над частным членом с аксессуарами: вы можете взять ссылку на него. –

+0

@Mike: это не имеет значения, если желание иметь «свойства, такие как C#», так как вы не можете ссылаться на (или передавать по ссылке и т. Д.) Свойство в C#. –

0

Свойства действительно предотвращают повреждение кода, если выполнены правильно. Это позволяет вам изменить реализацию свойства, находящегося под ним, без того, чтобы вызывающий пользователь мог изменить его код или даже беспокоиться об этом.

Например, скажем, у вас есть класс Socket, который принимает номер сокета. Реализуйте как свойство, чтобы просто взять int и сохранить его.

Однако ваш босс говорит, что вы не должны принимать номера сокетов ниже 1024. Ваше свойство может измениться, чтобы отсканировать его и не принять значение.

Без изменений код вызывающего абонента.

Редактировать: Незначительное неправильное понимание вопроса ... Я использовал свойства для обозначения обычных функций доступа.

+2

Если ваш ответ не относится к вопросу, вы должны его удалить. –

4

Свойства не являются идиоматическими Стандартные C++ - о чем свидетельствует тот факт, что в широко распространенной библиотеке нет единой библиотеки типа «собственность». Сложность правильной их реализации в соответствующем C++ значительна, а преимущества по сравнению с прямым вызовом методов доступа небольшими и в основном стилистическими. На мой взгляд, это не стоит беспокоить.

+0

QT имеет довольно широкое применение со свойствами. Я не особо забочусь об этом, но размышление полезно для разработки виджетов через редакторов свойств. – stinky472

+0

Qt использует свойства только как концепцию метаданных (для парных геттеров и сеттеров). Они не отображаются в клиентском коде - вы все же вручную вызываете аксессоры как 'name()' и 'setName()' и т. Д. Вопрос, по-видимому, касается свойств как синтаксического сахара (как в C#). –

0

Я однажды попытался реализовать нечто похожее на структуры Matlab в C++, i. е. структуры, к которым можно добавить именованные поля. После этого я стал твердым сторонником принципа «Не боритесь с языком».

0

Усилия, направленные на то, чтобы один язык программирования вел себя как другой, часто являются частным случаем inner platform effect.

Я согласен с другими - просто используйте геттеры и сеттеры.

Если вам действительно нужны свойства на C++, возможно, у вас уже есть их как расширение языка. Я думаю, что Visual C++ делает - почти наверняка для управляемого C++, но, возможно, для неуправляемых тоже. Лично, единственная причина, по которой я буду использовать их, - это управляемый C++, соответствующий требованиям .NET.

Вне этого, создание внутренней платформы для этого почти наверняка вызовет больше проблем, чем решает.

Смежные вопросы