爲什麼使用boost :: optional作爲scoped_ptr不是常見的地方,它似乎更好,因爲對象是在堆棧而不是堆上創建的。但我從來沒有見過這種方式。我的問題是,使用boost :: optional作爲一種scoped_ptr而不是明顯無法做多態的缺點是什麼?爲什麼不使用boost ::可選作爲更好的scoped_ptr
回答
首先,我會說語義。
我需要刷新boost::optional
和boost::scoped_ptr
細節我記憶給在技術方面的意見,但是當涉及到可維護性,代替指針使用optional
s是綁定混淆誰看了你的代碼的人。
如果boost/std會定義像value_ptr與boost :: optional具有相同的實現。 – gast128
原因是多態性是點scoped_ptr
。否則,你只需要在棧上聲明變量。
int main()
{
Class object(52, 25); //sample declaration, with constructor arguments passed
}
編輯1(從意見的迴應附加信息):
boost::scoped_ptr
實際上很少用於你描述(主要是因爲你不能複製,也不動boost::scoped_ptr
的目的,讓你存儲它的類在不可複製和不可移動的情況下)。看起來boost::optional
適用於此目的,但是...
請注意,在本地使用boost::optional
(即,不從函數返回)時沒有什麼意義,因爲您可以根據意願在堆棧上創建對象:
void another_function()
{
if(some_condition())
{
Class object(0, 0); // create the object
// use the object
}
else
{
// don't use the object
}
}
還有一個目的是讓一個成員可以獨立於它所屬的類創建和銷燬。也許一個懶惰的初始化對象? – dan
@dan我更新了我的答案。 – milleniumbug
- 1. 爲什麼boost :: scoped_ptr在繼承方案中不起作用?
- 2. 爲什麼boost :: scoped_ptr或std :: unique_ptr不可複製?
- 3. 爲什麼我不能從函數返回Boost :: Scoped_ptr?
- 4. 爲什麼boost :: any比void *更好?
- 5. 爲什麼bada不需要scoped_ptr?
- 6. 爲什麼使用比使用更好?
- 7. 爲什麼不能使用Point和Rectangle作爲可選參數?
- 8. boost :: scoped_ptr文檔不一致?
- 9. 使用Void作爲可選參數的更好選擇
- 10. 爲什麼$ .browser不推薦使用 - 什麼是更好的選擇?
- 11. 爲什麼list.sort不使用可選API
- 12. 爲什麼這項工作(不使用與使用可選項)?
- 13. 在頂級scoped_ptr上使用shared_ptr的好處是什麼?
- 14. 爲什麼使用str()比__str更好__()
- 15. 爲什麼選擇spefic網站更好?
- 16. NULL檢查boost :: scoped_ptr
- 17. 爲什麼std :: make_shared <>()比boost :: make_shared()有更好的性能?
- 18. 爲什麼使用模型作爲枚舉不好?
- 19. 爲什麼require_once不好用?
- 20. 使用boost :: scoped_ptr的如果可能的話
- 21. C++中的boost :: scoped_ptr和STL
- 22. 有什麼更好的使用,爲什麼?
- 23. 哪個更好?爲什麼?
- 24. 什麼是'不可驗證的代碼',爲什麼它不好?
- 25. 爲什麼boost :: ptr_list使用底層void *?
- 26. 爲什麼我不能使用DateTime.MinValue和int.MinValue作爲C#4.0中的可選值?
- 27. 爲什麼在使用boost :: split時必須使用boost :: is_any_of?
- 28. 爲什麼用戶名不可更改?
- 29. 使用PHP,爲什麼選擇的選項不總是工作?
- 30. 爲什麼我可以更新boost :: fibonacci_heap中的彈出元素?
剛纔聲明你想要的變量有什麼問題,爲什麼把它包裝在boost :: optional中呢? –
我有同樣的想法。從性能角度來看,boost :: optional會擊敗scoped_ptr。只有嚴重的缺點是語義(或'milleniumbug'指出缺少多態性) – gast128