Я портировании 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, который освобождает коллекцию.)
И есть ли существенная разница между возвратом необработанного указателя или ссылки?
Двое из возможных способов - нет. Они даже не компилируются. –
Сохраните коллекцию (вариант 1), верните ссылку (вариант 4). Если хранилище принадлежит 'vector', вы не должны беспокоиться о указателях. Конечно, вам нужно переместить амперсанд в правильное положение для его компиляции. – dasblinkenlight
Спасибо за исправление, не скомпилировали код перед публикацией. –