заранее извиняюсь за большую портянку в вопросе
Подскажите как более правильно и красиво реализовать следующий функционал:
предыстория
у меня обрабатывается массив разношерстных объектов (отвечающих за разные статистики)
std::vector<...> objects;
, объединённых некоторым общим минимальным функционалом (.add, .get, .save и т.п.) поэтому хотя упомянутые объекты принадлежат разным классам, я их всех унаследовал от одного базового абстрактного класса, задающего упомянутый минимальный функционал
std::vector<IBaseStatistics*> objects;
object[0]->add(12.75); // пример использования
Каждый класс объектов (статистик) обладает своими начальными входными параметров, которые задаются при создании:
objects.push_back(new CStatistics1(1, "data", true));
objects.push_back(new CStatistics2(L"unicode", 3.1415);
задача 1
Но вот у меня возникла потребность в новом классе, который содержит массив старого класса заданного вида, т.е.
class CStatictics_new: public IBaseStatistics
{
protected:
std::vector<CStatistics1> m_inner;
}
При этом новый класс требует как своих начальных входных параметров, так и входных параметров используемого в массиве класса (CStatistics1).
И у меня встал вопрос - как правильнее задавать эти входные параметры для класса CStatistics1?
В голову приходит 2 способа (использовал первый):
1) задавать параметры для обоих классов в конструкторе "главного" класса, т.е.:
objects.push_back(new CStatistics_new(
value1, value2,
1, "data", true
));
хранить полученные параметры класса CStatistics1 как члены класса CStatistics_new и когда требуется пополнять массив m_inner использовать их
2) в классе CStatistics1 хранить параметры как члены класса, добавить некоторый метод clone, чтобы создавать копии класса и передать в класс CStatistics_new созданный вне этого класса объект класса CStatistics1
Как лучше поступить? Может есть 3 способ, более правильный и лучший, чем те, которые привёл выше?
задача 2
впоследствии оказалось, что класс CStatistics_new нужен для работы и с другими типами и я его сделал просто шаблонным
template <class ICustomStatistics>
class CStatictics_new: public IBaseStatistics
{
protected:
std::vector<ICustomStatistics> m_inner;
}
но после этого возникли проблемы с передачей параметров для класса ICustomStatistics в конструкторе класса CStatictics_new
и первый описанный метод уже не работает, т.е. остается только второй
Что можно сделать в этом случае?
P.S.
т.е. основной вопрос - способ передавать разные параметры для классов внутри других классов
Сборка персонального компьютера от Artline: умный выбор для современных пользователей