Можно ли наследовать реализацию от контейнеров STL, а не делегировать?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли наследовать реализацию от контейнеров STL, а не делегировать?

Сообщение Anonymous »

У меня есть класс, который адаптирует std::vector для моделирования контейнера объектов, специфичных для предметной области. Я хочу предоставить пользователю большую часть API std::vector, чтобы он мог использовать знакомые методы (size,clear, at и т. д.) и стандартные алгоритмы в контейнере. Кажется, это повторяющаяся закономерность в моих проектах:

class MyContainer : public std::vector
{
public:
// Redeclare all container traits: value_type, iterator, etc...

// Domain-specific constructors
// (more useful to the user than std::vector ones...)

// Add a few domain-specific helper methods...

// Perhaps modify or hide a few methods (domain-related)
};


Мне известна практика предпочтения композиции наследованию при повторном использовании класса для реализации, но должен быть предел! Если бы я делегировал все в std::vector, было бы (по моим подсчетам) 32 функции пересылки!

Поэтому у меня вопросы... Так ли это на самом деле? плохо наследовать реализацию в таких случаях? Каковы риски? Есть ли более безопасный способ реализовать это без большого количества набора текста? Я еретик, использующий наследование реализации? :)

Изменить:

А как насчет того, чтобы прояснить, что пользователь должен не использовать MyContainer через указатель std::vector:

// non_api_header_file.h
namespace detail
{
typedef std::vector MyObjectBase;
}

// api_header_file.h
class MyContainer : public detail::MyObjectBase
{
// ...
};


Похоже, что библиотеки повышения делают это постоянно.

Редактировать 2:

Одним из предложений было использование бесплатных функций. Я покажу это здесь как псевдокод:

typedef std::vector MyCollection;
void specialCollectionInitializer(MyCollection& c, arguments...);
result specialCollectionFunction(const MyCollection& c);
etc...


ОО-способ сделать это:

typedef std::vector MyCollection;
class MyCollectionWrapper
{
public:
// Constructor
MyCollectionWrapper(arguments...) {construct coll_}

// Access collection directly
MyCollection& collection() {return coll_;}
const MyCollection& collection() const {return coll_;}

// Special domain-related methods
result mySpecialMethod(arguments...);

private:
MyCollection coll_;
// Other domain-specific member variables used
// in conjunction with the collection.
}


Подробнее здесь: https://stackoverflow.com/questions/203 ... n-delegate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Есть ли способ делегировать фиктивную реализацию реальному классу без необходимости настраивать каждый метод?
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Наследовать сразу или наследовать по одному
    Anonymous » » в форуме C++
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Наследовать сразу или наследовать по одному
    Anonymous » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • C++: скопируйте контейнер STL в контейнер STL, используя лямбда-выражение
    Anonymous » » в форуме C++
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • C++: скопируйте контейнер STL в контейнер STL, используя лямбда-выражение
    Anonymous » » в форуме C++
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»