2012-07-17 30 views
2

我移植一个C#应用程序到C++,我有下面的类(其中Box是一个结构,而BoxStore将在应用一个全球性的,长期的生活目标):最佳实践的方式来存储收集

public class BoxStore 
{ 
    private List<Box> boxes; 

    ... 

    public List<Box> GetBoxes() 
    { 
     return this.boxes; 
    } 
} 

我打算将这些盒子集合存储在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对象,释放集合。)

并且返回一个原始指针或引用之间有显着差异吗?

+0

你的两种可能的方式不是。他们甚至不编译。 – 2012-07-17 13:16:29

+2

存储集合(选项1),返回参考(选项4)。如果商店拥有“矢量”,则不应该使用指针。当然,您需要将&符号移动到正确的位置进行编译。 – dasblinkenlight 2012-07-17 13:17:23

+0

感谢您的更正,在发布之前还没有编译过代码。 – 2012-07-17 13:34:05

回答

1

这可能是您正在寻找的可能之一。BoxStore确实拥有这些对象。所以,不需要指针等。 我假设单个盒子对象和列表不会比存储更长。 如果你有这个要求,那么你可能需要考虑使用指针。

关于通过引用返回的设计不是很好的设计,因为它违反了封装。所以,如果你没有约束来允许客户修改列表,我会提供一份列表的副本。

#include <list> 

class Box 
{ 
... 
}; 

class BoxStore 
{ 
private : 
    std::list<Box> boxes; 

public : 
    std::list<Box>& GetBoxes() 
    { 
     return boxes; 
    } 
} 
+0

感谢您的回答。你是对的,盒子对象(实际上它们是轻量级的数据传输对象),集合不会超过商店。 – 2012-07-17 13:47:48