我想知道如何在C ++中创建正确的属性。在Objective C中,我使用“@property”(通常使用(非原子,保留)属性)。
C ++中的正确方法是什么?
谢谢!
答案 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 ++可以说是“一种方式”)并且试图将共享所有权强加给它通常是脆弱的。