Поскольку вы знаете размер во время компиляции, я предлагаю использовать array
вместо vector
. Использование шаблона класса array
вместо массива в стиле C дает вам преимущество стандартного интерфейса контейнера, такого как vector
. То есть вы можете вызвать size()
для массива и получить итераторы и т. Д.
И чтобы вы не забыли delete
объекты, я предлагаю использовать умные указатели:
#include <boost/array.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
boost::array<boost::shared_ptr<L>, 3> ls = { {
boost::make_shared<A>(),
boost::make_shared<B>(),
boost::make_shared<C>(),
} };
Современные компиляторы поставляют свои собственные версии array
и shared_ptr
в стандартной библиотеке:
#include <array>
#include <memory>
std::array<std::shared_ptr<L>, 3> ls = { {
std::make_shared<A>(),
std::make_shared<B>(),
std::make_shared<C>(),
} };
Обратите внимание, что внешние скобки технически не нужны, но их пропуск может привести к предупреждению компилятора, по крайней мере, так происходит с моим компилятором.
В идеале я хотел бы вытащить определение и инициализацию вектора из main
и, предпочтительно, в отдельный файл, который я затем смогу #include
В этом случае вам понадобится заголовочный файл с объявлением и файл реализации с определением ls
:
// file ls.h
#ifndef LS_H
#define LS_H
#include <boost/array.hpp>
#include <boost/shared_ptr.hpp>
extern boost::array<boost::shared_ptr<L>, 3> ls;
#endif
// file ls.cpp
#include "ls.h"
#include <boost/make_shared.hpp>
boost::array<boost::shared_ptr<L>, 3> ls = { {
boost::make_shared<A>(),
boost::make_shared<B>(),
boost::make_shared<C>(),
} };