我正在設計一個基於virtual
方法的C++類接口,以便能夠提供可擴展性點。std :: unique_ptr和std :: shared_ptr作爲虛函數的參數
很多這些公共方法都需要heap
分配的對象作爲參數。
由於我正在使用現代C++模式,因此我打算使用std::unique_ptr
或std::shared_ptr
,但我對它們都有疑問。
使用std ::的unique_ptr看起來是這樣的:
class IFoo {
virtual void doSomethingWithUser(std::unique_ptr<User> user) = 0;
}
強制調用者提供std::unique_ptr
有缺點:
- 主叫不能做,因爲它提供的用戶進行任何操作必須移動
- 如果任何
doSomethingWithUser
實現需要將用戶存儲在某個容器中,則不能從std::shared_ptr
對所有公共方法使用std::shared_ptr
可以解決問題,但我們必須支付額外的內存空間以及引用計數的原子增量和減量。
有沒有我可以遵循的經驗法則?
「很多這些公共方法都需要堆分配對象作爲參數。」咦?那是什麼意思? –
@FredLarson如上例所示,用戶是堆分配的,它並不在棧中。 (用戶不可複製,因此需要堆分配它) – steazzalini
我沒有看到什麼堆與堆棧分配有什麼關係。你的意思是你需要傳遞指針(或引用)而不是傳值? –