什么是C ++相当于Objective C“@property(nonatomic,retain)”?

时间:2012-01-09 15:48:45

标签: c++ objective-c cocoa properties

我想知道如何在C ++中创建正确的属性。在Objective C中,我使用“@property”(通常使用(非原子,保留)属性)。

C ++中的正确​​方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

正如Seva所说,C ++中没有这种意义上的属性。您可以做什么:编写一个带有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 boost shared_ptr类型总是原子的。但是,访问对象本身(取消引用指针)将是非原子的。如果需要,你必须自己处理。

答案 1 :(得分:1)

@ Ame的代码是正确的,但这里没有特别要求使用shared_ptr。我对shared_ptr广泛使用感到非常不满。它可能很有用,但在我的经验中引入了许多微妙的复杂性。它不是传统的C ++方法。 C ++通常更喜欢强对象所有权而不是共享所有权(这是ObjC中的常见模型)。如果你使用shared_ptr,它是内置的Cocoa平台,所以你不需要提升。您可能需要阅读Wrapping C++ – Take 2, Part 2以了解shared_ptr周围的一些复杂性(它有点过时,其中一些不适用于ARC代码)。

那就是说,@ Ame的方法基本上是正确的。但是您通常会使用复制来处理简单属性而不是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 ++通常鼓励强大的对象所有权而不是共享所有权。因此,(通常)应该有一个对象负责创建,管理和销毁其他复杂对象。其他人应该只从对象的所有者那里获得引用。他们不应该自己创建或破坏对象。

并非共享或严格的所有权是更好的IMO。只是共享所有权是ObjC方式,所有代码都以这种方式工作(并且它非常优雅)。严格的所有权更多的是C ++方式(就像C ++可以说是“一种方式”)并且试图将共享所有权强加给它通常是脆弱的。