У меня есть класс widget
.
У меня есть абстрактный класс base
с дериватами derived_a
, derived_b
и т.д.Передайте список производных для хранения как член
Я хочу widget
провести произвольное количество объектов, которые порождаются из base
для того, чтобы впоследствии использовать их полиморфно.
Моя первая попытка выглядит следующим образом:
#include <vector>
#include <ostream>
#include <iostream>
#include <memory>
class widget {
public:
explicit widget(std::vector<std::unique_ptr<base>>&& params) :
members {std::move (params)}
{
}
private:
std::vector<std::unique_ptr<base>> members;
};
И будет называться так:
std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
widget w (std::move(v));
Однако это решение швы unnessesarry подробны и удобной для пользователей на всех, особенно при предоставлении мультипликатор типы:
std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
widget w {std::move(v)};
Вместо этого, я бы предпочел использовать по строкам
widget w {derived_a(),
derived_b(),
derived_c(),
derived_a(),
derived_b(),
derived_c()};
так что widget
снабжена списком rvalues, что он затем может превратиться в std::vector<unique_ptr<base>>
.
У меня сложилось впечатление, что это может быть достигнуто с помощью шаблонов для ctor, но, несмотря на интенсивный поиск в Google, я не знаю, как точно достичь моей цели.
Пожалуйста, обратите внимание, что шаблон класса решение, которое будет выглядеть Tike это:
widget<derived_a,
derived_b,
derived_c,
derived_a,
derived_b,
derived_c> w;
нежелательно, так как мне нужно предоставить некоторые deriveds с параметрами.
К сожалению - я не думал о проблемах ООП в то время ... Но не могли бы вы добиться более простого кодирования с использованием фабричного класса? '' class wf {static std :: unique_ptr make_a (/ * возможно, некоторые аргументы * /) {...}; ...}; '', а затем '' widget w; w.visuals ({wf :: make_a(); ...}) ''? –
BitTickler
только немного «менее» подробный. AFAIK вам не нужно «двигаться» в 'push_back' – Hayt
Ну, попробовав мою фабричную идею вроде флопа. Кажется, '' std :: unique <> '' имеет проблемы с обработкой абстрактных базовых классов. Кто бы мог предположить, что они внутренне пытаются сделать копии? :) – BitTickler