Если вы хотите, чтобы контейнер в базовом классе оставался закрытым, вы можете рассмотреть возможность добавления общедоступной (или защищенной) функции в Base
, чтобы позволить производному классу добавить диапазон.Таким образом, контейнер типа Base
может быть инкапсулирован (Derived
не должен знать, что это vector
), и Derived
все равно может передать все это за один выстрел:
class Base
{
...
private:
std::vector<X> v;
protected
template <class iterator_t>
void assign( iterator_t first, iterator_t last) {
v.assign( first, last);
}
};
class Derived : public Base
{
Derived(X* p, int n) {
Base::assign( p, p+n);
}
};
Это не слишком инкапсуляция, но контейнер можно изменить, изменив производный класс, и можно легко написать производный класс, который при желании принимает данные в форме, отличной от массива.И , как предложил zdan , эта функциональность может быть частью открытого или защищенного конструктора для Base
, если это имеет больше смысла (что вероятно).
Идея использования диапазонов итераторов для представлениясодержимое или подмножество контейнера широко распространено в STL.