Указатель против переменной в классе - PullRequest
8 голосов
/ 14 января 2011

Я знаю, в чем разница и как они оба работают, но этот вопрос больше касается стиля кодирования.

Всякий раз, когда я кодирую, я создаю много классов, у всех них есть переменные, и некоторые из них являются указателями инекоторые нормальные переменные.Я обычно предпочитаю переменные указателям, если этот член длится столько же, сколько и класс, но тогда мой код становится таким:

engine->camera.somevar->x;
// vs
engine->camera->somevar->x;

Мне не нравится точка в середине.Или с частными переменными:

foo_.getName();
// vs
foo_->gatName();

Я думаю, что точка «исчезает» в длинном коде.Я считаю, что -> легче читать в некоторых случаях.

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

PS Я думаю, что точка выглядит лучше в некоторых случаях.

Ответы [ 4 ]

6 голосов
/ 14 января 2011

Прежде всего, это плохо выставлять переменные-члены.

Во-вторых, ваш класс, вероятно, никогда не должен содержать указатели.

Небольшое следствие: классы, содержащие бизнес-логику, никогда не должны иметь указателей (поскольку это означает, что они также содержат код управления указателями, а код управления указателями следует оставлять классам, которые не имеют бизнес-логики, но предназначены специально для управления указателями ( умные указатели и контейнеры).

Классы управления указателями (умные указатели / контейнеры) должны быть разработаны для управления одним указателем. Управлять более чем одним гораздо сложнее, чем вы ожидаете, и мне еще предстоит найти ситуацию, когда дополнительная сложность окупилась.

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

В C ++ редко можно увидеть указатели.
Они обычно скрыты внутри других классов. Но вы должны привыкнуть к использованию смеси -> и ., поскольку все зависит от контекста и того, что вы пытаетесь передать. Пока код чистый и читаемый, он не имеет большого значения.

Личное дополнение:

Я ненавижу _ в конце вашего идентификатора. исчезнуть foo_.getName() Я думаю, что это будет выглядеть намного лучше, как foo.getName()

1 голос
/ 14 января 2011

Вы не должны делать свой выбор, потому что вы находите «->» более удобным для чтения :) Использование переменной-члена обычно лучше, так как вы не можете делать ошибки с указателем.

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

Решение состоит в том, чтобы использовать std :: auto_ptr или boost :: scoped_ptr или аналогичный умный указатель.Там вы получите преимущество обоих решений, с очень небольшими недостатками.

my2c

РЕДАКТИРОВАТЬ:

Некоторые полезные ссылки:
Статья на std ::auto_ptr
boost :: scoped_ptr
Pimpl: частная реализация

1 голос
/ 14 января 2011

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

Его также легче обрабатывать, поскольку вероятность ошибок, связанных с указателем,уменьшено.

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

РЕДАКТИРОВАТЬ:

Я думаю, это означает, что я обычно идус альтернативой указателя: -)

РЕДАКТИРОВАТЬ 2:

И да, мой ответ предполагает, что вы действительно хотите (или имеете) выбирать между двумя, то есть что вы пишете код в стиле C,Надлежащий объектно-ориентированный способ доступа к членам класса - через функции get / set.

Мои комментарии относительно того, включать ли фактический экземпляр класса или указатель / ссылку на него, вероятно, все еще действительны.

0 голосов
/ 14 января 2011

В идеале, вы не должны использовать либо: вы должны использовать методы получения / установки.Падение производительности минимально (в любом случае компилятор, вероятно, оптимизирует его).

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

Если ни один из них не смущает вас, то я бы сказал, что все, что осталось, это вопрос личных предпочтений.

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