2012-01-09 83 views

回答

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

@Ame的代码是正确的,但没有特别要求在这里使用shared_ptr。我对广泛使用shared_ptr非常感兴趣。它可能很有用,但在我的经验中引入了很多微妙的复杂性。这不是传统的C++方法。 C++通常更喜欢强对象所有权,而不是共享所有权(这是ObjC中的常见模型)。如果你使用shared_ptr,它是内置于Cocoa平台的,所以你不需要提升。您可能需要阅读Wrapping C++ – Take 2, Part 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++可以说是“一种方式”一样),并试图强化共享所有权,这往往是脆弱的。

+3

我强烈反对Google的风格指南得到充分考虑并且是一个好的开始。 Google的风格指南针对的是拥有混合C和C++代码库的人(例如,例外情况被禁止)。对于纯粹的C++代码库,绝对不是应该使用的东西。在暴露Google风格指南之前,应该鼓励初学者使用其他资源(请参阅C++标签中的优秀书籍,阅读GotW网站,...),以便他们能够以一丝盐的态度接受其建议。 – 2012-01-09 17:42:46

+0

我会推迟到@MatthieuM。这里纯粹的C++项目。我主要是一个ObjC开发人员,他经常将C和C++代码混合在一起。正如他所指出的,Google的风格是为这种情况而设计的,因此对我来说工作得相当好(如果不是完美的话)。 – 2012-01-09 18:12:37

相关问题