簡體   English   中英

什么是C ++相當於Objective C“@property(nonatomic,retain)”?

[英]What is the C++ equivalent of Objective C “@property (nonatomic, retain)”?

我想知道如何在C ++中創建正確的屬性。 在Objective C中,我使用“@property”(通常使用(非原子,保留)屬性)。

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的使用非常shared_ptr 它可能很有用,但在我的經驗中引入了許多微妙的復雜性。 它不是傳統的C ++方法。 C ++通常更喜歡強對象所有權而不是共享所有權(這是ObjC中的常見模型)。 如果你確實使用shared_ptr ,它是內置的Cocoa平台,所以你不需要提升。 您可能需要閱讀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:的使用protected: 就像ObjC一樣,你甚至應該在類中使用訪問器,絕對應該在子類中使用它們。 允許子類直接訪問ivars是脆弱的。 它要求子類具有超類的特殊知識。

對於字符串屬性和其他簡單或不可變對象,通常應使用復制構造函數而不是shared_ptr 對於更復雜,可變的對象,C ++通常鼓勵強大的對象所有權而不是共享所有權。 因此,(通常)應該有一個對象負責創建,管理和銷毀其他復雜對象。 其他人應該只從對象的所有者那里獲得引用。 他們不應該自己創建或銷毀對象。

並不是共享或嚴格的所有權是更好的IMO。 只是共享所有權是ObjC方式,所有代碼都以這種方式工作(並且它非常優雅)。 嚴格的所有權更多的是C ++方式(就像C ++可以說是“一種方式”)並且試圖將共享所有權強加給它通常是脆弱的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM