[英]Best practice way to store collection
我正在將C#應用程序移植到C ++,並且具有以下類(其中Box是一個結構,而BoxStore將是該應用程序中的一個長期存在的全局對象):
public class BoxStore
{
private List<Box> boxes;
...
public List<Box> GetBoxes()
{
return this.boxes;
}
}
我打算將box集合存儲在C ++的std :: vector中。 有多種定義集合的方法:
std::vector<Box> boxes;
shared_ptr<std::vector<Box>> boxes;
std::vector<Box>& boxes;
(*std::vector<Box> boxes;)
最好的方法是-如果有的話? 我猜最后一個選項(存儲指向集合的原始指針)是最糟糕的解決方案,沒有任何好處(因此是無謂的)。
移植GetBoxes方法的最佳方法是什么? 當然,這取決於存儲集合的方式。 我在這里也可以看到多種方法:
(std::vector<Box> GetBoxes();)
std::shared_ptr<std::vector<Box>> GetBoxes();
*std::vector<Box> GetBoxes();
std::vector<Box>& GetBoxes();
第一種解決方案似乎是不正確的,因為向量將在返回時被復制,因此調用者無法修改原始集合。
但是,其他三種方法對我來說也同樣不錯。 BoxStore實例的壽命很長,並且在應用程序運行時不會被破壞,因此調用者將沒有對該集合的所有權。 這是否意味着返回shared_ptr在語義上不正確? (總是由BoxStore對象釋放集合。)
返回原始指針或引用之間有明顯區別嗎?
這可能是您正在尋找的可能。 BoxStore確實擁有這些對象。 因此,不需要指針等。 我假設單個盒子對象和列表不會超過商店。 如果有此要求,則可能需要考慮使用指針。
關於按引用返回不是一個好的設計,因為它違反了封裝 。 因此,如果您沒有允許客戶端修改列表的約束,那么我將提供一份列表副本。
#include <list>
class Box
{
...
};
class BoxStore
{
private :
std::list<Box> boxes;
public :
std::list<Box>& GetBoxes()
{
return boxes;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.