C++中与Objective C的"@property (nonatomic, retain)"等效的是什么?

4

我想知道如何在C++中正确地创建属性。在Objective C中,我使用"@property"(通常与(nonatomic,retain)属性一起使用)。

那么在C++中应该怎么做呢?

谢谢!


3
在C++中,没有关于“属性”(properties)的一流概念。虽然有一些供应商特定的扩展可以实现类似的效果,但据我所知,在Mac世界中并不存在这样的扩展。 - Seva Alekseyev
2个回答

3
如Seva所说,在C++中没有这种意义上的属性。你可以这样做:编写一个具有 boost::shared_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;
}

共享指针将处理共享和引用计数,基本上模拟某种“保留”行为。如果我没记错的话,boost shared_ptr类型在更新引用计数时总是原子的。然而,访问对象本身(解除引用指针)将是非原子的。如果需要,您将不得不自己处理这个问题。


1
@Ame的代码是正确的,但在这里没有特别要求使用shared_ptr。我对广泛使用shared_ptr有些犹豫。从我的经验来看,它可以很有用,但也会引入许多微妙的复杂性。这不是传统的C++方法。C++通常更喜欢强对象所有权而不是共享所有权(这是ObjC中常见的模式)。如果您确实使用shared_ptr,则它已内置于Cocoa平台中,因此您不需要使用boost。您可能需要阅读Wrapping C++ – Take 2, Part 2,以了解一些关于shared_ptr的复杂性(其中一些内容有点过时,与ARC代码无关)。

话虽如此,@Ame的方法基本上是正确的。但通常情况下,你会将复制用于简单属性,而不是shared_ptr。(这在大多数ObjC代码中也适用于字符串的复制。)对于寻找样式指南的人,我通常推荐Google的。它不是完美的,但考虑得非常周到,而且最好从一些已知适用于许多人的东西开始,而不是自己发明一个。 (编辑:请参见@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一样,即使在类内部,你也应该使用访问器,并且在子类中肯定应该使用它们。允许子类直接访问实例变量是脆弱的。这要求子类具有其超类的特殊知识。

对于字符串属性和其他简单或不可变对象,通常应该使用复制构造函数,而不是像shared_ptr那样的任何东西。对于更复杂、可变的对象,C++通常鼓励强对象所有权,而不是共享所有权。因此,通常应该有一个对象负责创建、管理和销毁另一个复杂对象。其他人只需从对象的所有者获取引用。他们不应该自己创建或销毁对象。

并不是说共享所有权或严格所有权更好。我认为只是共享所有权是ObjC的方式,所有代码都是这样工作的(而且这非常优雅)。严格所有权更多地是C++的方式(尽管C++可以说有“一种方式”),试图将共享所有权塞入其中通常是脆弱的。


3
我强烈反对认为谷歌的编程风格指南非常值得考虑并且是一个很好的起点。谷歌的编程风格指南是针对那些拥有混合 C 和 C++ 代码库的人(例如禁止使用异常处理)。对于纯粹的 C++ 代码库,它绝对不应该被使用。初学者应该被鼓励在接触谷歌的编程风格指南之前使用其他资源(例如查看 C++ 标签下的优秀书籍、阅读 GotW 网站等),这样他们才能把指南中的建议视为参考而非绝对。 - Matthieu M.
我将在纯C++项目上听从@MatthieuM.的建议。我主要是一个ObjC开发者,经常在混合C和C++代码之间桥接。正如他所指出的,谷歌的风格是为这种情况设计的,对我来说工作得相当不错(虽然不完美)。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接