我想知道如何在C++中正确地创建属性。在Objective C中,我使用"@property"(通常与(nonatomic,retain)属性一起使用)。
那么在C++中应该怎么做呢?
谢谢!
我想知道如何在C++中正确地创建属性。在Objective C中,我使用"@property"(通常与(nonatomic,retain)属性一起使用)。
那么在C++中应该怎么做呢?
谢谢!
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类型在更新引用计数时总是原子的。然而,访问对象本身(解除引用指针)将是非原子的。如果需要,您将不得不自己处理这个问题。
话虽如此,@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++可以说有“一种方式”),试图将共享所有权塞入其中通常是脆弱的。