У меня был похожий случай, подобный этому. Я предлагаю, чтобы у вас было 2 «базовых класса» или «суперкласса».
Первый класс, очень общий класс, представляет «концептуальный корень» для всех классов контейнеров, почти не методов, похожих на интерфейс, и должен иметь вид:
container.hpp
class Container
{
protected:
int GetValue();
void SetValue(int newValue);
size_t GetSize();
void Resize(size_t);
};
Второй класс начинает становиться чуть менее концептуальным и более "реальным миром":
mcontainers.hpp
#include "containers.hpp";
class MethodContainer: public Container
{
protected:
void Replace(const std::size_t Start, const std::size_t End, const T Value);
void Replace(const std::size_t Start, const std::size_t End, const MyClass Other);
void Insert(const std::size_t Index, const T Value);
void Insert(const std::size_t Index, const MyClass Other);
void Delete(const std::size_t Index);
void Delete(const std::size_t Start, const std::size_t End);
}
И, наконец, некоторые классы, которые являются конкретными:
stacks.hpp
#include "containers.hpp";
#include "mcontainers.hpp";
#define pointer void*
class Stack: public MethodContainer
{
public:
// these methods use "mcontainer::Insert", "mcontainer::Replace", etc
void Push(pointer Item);
void Pop();
pointer Extract();
}
AS @Chris упомянул, что для этого есть несколько библиотек, но из правила всегда есть исключение, и вы можете захотеть «заново изобрести колесо», если вам это нужно.
У меня было приложение с его набором библиотек, которое включало в себя некоторые контейнеры / коллекции. Это было сделано в другой прогр. Langr. и нужно его перенести на C ++.
Хоть я и проверил стандартные библиотеки c ++, я прекратил миграцию своих библиотек на C ++, потому что у меня было несколько библиотек, вызывающих библиотеки контейнеров, и мне нужно было это сделать быстро.
При использовании «базовых классов» вы можете захотеть «защитить» своих членов и «донести это до общественности» в дочерних классах. Я обычно не делаю "приватные" поля или методы, если это не обязательно.
Резюме: Некоторые очень распространенные сложные вещи (например, выделение памяти или хранение) могут быть выполнены в ваших базовых классах, но большинство этих сложностей следует оставить на усмотрение дочерних классов.