我想知道如何在C++中創建正確的屬性。在Objective C中,我使用「@property」(通常與(非原子,保留)屬性)。Objective C「@property(nonatomic,retain)」的C++等價物是什麼?
C++中的正確方法是什麼?
謝謝!
我想知道如何在C++中創建正確的屬性。在Objective C中,我使用「@property」(通常與(非原子,保留)屬性)。Objective C「@property(nonatomic,retain)」的C++等價物是什麼?
C++中的正確方法是什麼?
謝謝!
正如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類型始終是原子的。但是,訪問對象本身(取消引用指針)將是非原子的。如果需要,你將不得不自己處理。
@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++可以說是「一種方式」一樣),並試圖強化共享所有權,這往往是脆弱的。
我強烈反對Google的風格指南得到充分考慮並且是一個好的開始。 Google的風格指南針對的是擁有混合C和C++代碼庫的人(例如,例外情況被禁止)。對於純粹的C++代碼庫,絕對不是應該使用的東西。在暴露Google風格指南之前,應該鼓勵初學者使用其他資源(請參閱C++標籤中的優秀書籍,閱讀GotW網站,...),以便他們能夠以一絲鹽的態度接受其建議。 – 2012-01-09 17:42:46
我會推遲到@MatthieuM。這裏純粹的C++項目。我主要是一個ObjC開發人員,他經常將C和C++代碼混合在一起。正如他所指出的,Google的風格是爲這種情況而設計的,因此對我來說工作得相當好(如果不是完美的話)。 – 2012-01-09 18:12:37
在C++中沒有一流的屬性概念。一些廠商特定的擴展存在,但在Mac世界沒有(IIRC)。 – 2012-01-09 15:51:08