2012-07-17 3 views
2

Я портировании C# приложение C++, и у меня есть следующий класс (где Box является структура, и BoxStore будет глобальным, длинный живой объект в приложении):Наилучшая практика способ хранения коллекции

public class BoxStore 
{ 
    private List<Box> boxes; 

    ... 

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

Я планирую хранить коллекцию ящиков в std :: vector в C++. Существует несколько способов определения коллекции:

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

Двое из возможных способов - нет. Они даже не компилируются. –

+2

Сохраните коллекцию (вариант 1), верните ссылку (вариант 4). Если хранилище принадлежит 'vector', вы не должны беспокоиться о указателях. Конечно, вам нужно переместить амперсанд в правильное положение для его компиляции. – dasblinkenlight

+0

Спасибо за исправление, не скомпилировали код перед публикацией. –

ответ

1

Это может быть возможный вариант, который вы ищете. BoxStore действительно владеет объектами. Поэтому нет указателей и т. Д. Я предполагаю, что отдельные объекты коробки и список не ожидают Магазин. Если у вас есть это требование, вам может потребоваться использовать указатели.

Что касается возврата по ссылке не очень хороший дизайн с он нарушает инкапсуляцию. Итак, если у вас не было ограничения, позволяющего клиентам изменять список, я бы предоставил копию списка.

#include <list> 

class Box 
{ 
... 
}; 

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

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

Спасибо за ответ. Вы правы, объекты коробки (на самом деле это легкие объекты передачи данных), и коллекция не переживет магазин. –

Смежные вопросы