@ Код Амэ правильный, но нет особого требования использовать shared_ptr
здесь. Я очень разрываюсь от использования shared_ptr
в широком смысле. Это может быть полезно, но привносит много тонкой сложности в мой опыт. Это не традиционный подход C ++. C ++ часто предпочитает сильное владение объектами, а не совместное владение (что является обычной моделью в ObjC). Если вы используете shared_ptr
, он встроен для платформ Cocoa, поэтому вам не нужно повышать его. Возможно, вы захотите прочитать Обтекание C ++ - часть 2, часть 2 , чтобы получить представление о некоторых сложностях, связанных с shared_ptr
(это немного устарело, а некоторые из них не применимы к коду ARC).
Тем не менее, подход @ Амэ по существу правильный. Но вы обычно используете копирование для простых свойств, а не shared_ptr
. (Это особенно верно для строк, которые вы также копируете в большей части кода ObjC.) Для тех, кто ищет руководство по стилю, я обычно рекомендую Google's . Это не идеально, но очень хорошо продумано, и хорошо начинать с того, что, по крайней мере, известно, что работает для многих людей, прежде чем изобретать свое. (РЕДАКТИРОВАТЬ: см. Комментарий @Matthieu M. ниже для особого мнения.)
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
Обратите внимание, что private:
здесь правильно. Я не согласен с использованием @ Ame protected:
. Как и в ObjC, вы должны использовать средства доступа даже внутри классов, и определенно вы должны использовать их в подклассах. Разрешение подклассам прямого доступа к ivars хрупко. Требуется, чтобы подклассы имели специальные знания своего суперкласса.
Для строковых свойств и других простых или неизменяемых объектов обычно следует использовать конструктор копирования, а не что-либо подобное shared_ptr
. Для более сложных, изменчивых объектов C ++ обычно поощряет сильное владение объектами, а не совместное владение. Таким образом, должен быть (в общем) какой-то один объект, ответственный за создание, управление и уничтожение этого другого сложного объекта. Все остальные должны просто получить ссылки от владельца объекта. Они никогда не должны создавать или разрушать объект сами.
Дело не в том, что совместное или строгое владение лучше ИМО. Просто совместное владение является способом ObjC, и весь код работает таким образом (и в этом он чрезвычайно элегантен). Строгое владение - это, скорее, способ C ++ (можно сказать, что у C ++ есть «способ»), и попытка подкрепить совместное владение им часто бывает хрупкой.