Что такое С ++-эквивалент Objective C "@property (nonatomic, retain)"? - PullRequest
4 голосов
/ 09 января 2012

Мне интересно, как правильно создать свойства в C ++.В Objective C я использую "@property" (в общем, с (неатомными, сохраняющими) атрибутами).

Как правильно C ++?

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Как сказал Сева, в С ++ такого рода свойств нет. Что вы могли бы сделать: написать класс с boost :: share_ptr переменной-членом и, опционально, написать getter и setter для этого члена. Но это даже не обязательно, хотя может считаться хорошим поведением.

typedef boost::shared_ptr<std::string> StringPtrT;

class A {
public:
    void setStringProperty(StringPtrT s) { this->string_property = s; }
    StringPtrT getStringProperty() const { return this->string_property; }

protected:
    StringPtrT string_property;
}

Указатель общего доступа будет иметь дело с разделением и подсчетом ссылок, в основном имитируя какое-то поведение «сохранения». Повышение IIRC Типы shared_ptr всегда атомарны, когда дело доходит до обновления счетчиков ссылок. Однако доступ к самому объекту (разыменование указателя) будет неатомарным. При необходимости вам придется самостоятельно разобраться с этим.

1 голос
/ 09 января 2012

@ Код Амэ правильный, но нет особого требования использовать 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 ++ есть «способ»), и попытка подкрепить совместное владение им часто бывает хрупкой.

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