2015-08-21 8 views
0

我有兩個班。一個創建一個資源,然後發送到另一個類存儲它,以供程序的不同部分訪問。我要做的就是:第一次使用智能指針,我做得對嗎?

typedef std::shared_ptr<Object> ObjectPtr; 

ObjectPtr CreatorClass::Create() 
{ 
    ObjectPtr(new Object); 
    // ... 
    return ObjectPtr; 
} 

void StorageClass::Store(ObjectPtr obj) 
{ 
    myVector.push_back(obj); 
} 

ObjectPtr StorageClass::Get(int index) 
{ 
    return myVector[index]; 
} 

我的問題是:

  1. 我是正確使用shared_ptr或者我應該用別的東西嗎?
  2. 我應該將值ObjectPtr傳遞給Store函數和Get函數嗎?
+2

@cdhowie這個問題似乎是存根代碼,示例代碼或僞代碼,這是代碼評論上的** off-topic **。代碼審查是爲了**真實的工作代碼**。 –

+2

@cdhowie恐怕伊斯梅爾是正確的。請閱讀[Stack Overflow用戶代碼評論指南](http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users) –

回答

0

我正確使用shared_ptr還是應該使用別的東西?

如果您需要共享所有權,您是正確的。否則你錯了。

我應該傳遞ObjectPtr通過價值存儲功能

是。雖然你可能仍然做.push_back(std::move(obj))避免不必要的副本。

從Get函數?

取決於您是否想

  • 修改矢量原shared_ptr,然後通過非const引用返回,
  • 只是觀察它,然後通過const引用
  • 沒有返回的,即得到你自己的副本,然後返回值。
+0

Might '.emplace_back()'會更好嗎? – cdhowie

+0

@cdhowie不,它完全一樣好(在這種情況下)。 – emlai

+0

通過共享所有權,你的意思是其他類只是使用指針,或編輯底層對象? – Moody

0

那麼,一般來說,你不是非常有效地做它。我發現代碼存在多個問題,幾乎接近反模式。

  1. 無所不在的創造者。我的天哪,我討厭他們。在你的例子中, 'creator'有什麼意義?爲什麼不能直接由 用戶創建對象?
  2. 存儲功能。它有兩個問題。首先它除了向元素添加一個元素外,什麼也不做,再加上姐姐獲得,簡單地提取。鑑於此,這兩個功能應發送至 符合其創作者(雙關語意)。相反,我的向量應該是 暴露給班級用戶。否則,你嚴重限制了用戶體驗(例如,他們怎麼知道他們是否可以用給定的索引獲得 ?他們不知道矢量的大小!)。避開 獲得者和設定者。
  3. Store的第二個問題 - 如果我們想象Store不僅僅是將東西推向矢量,並且因此存在是有道理的,它接受值爲共享指針。這意味着,你是原子地增加計數器 。表現流淚。通過共享指針 參考以減少影響。更好的是,不要使用共享的 ponters。在我看到的99%的案例中,這種用法是不合理的。
+0

我只是使用這些名稱來簡化示例:)。創作者類實際上是一個導入器,它從光盤加載不同的格式並轉換爲單個格式以用於該程序。 Storage類還處理對象選擇(它是一個3D編輯器)和刪除。 – Moody

+0

我不明白你的意思是通過引用傳遞shared_ptr? 「創建者」類只有本地副本。 – Moody

+0

關於存儲功能的輸入參數,建議按引用傳遞。 – SergeyA