Как избежать повторения конструктора в детском творчестве - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть родительский класс и несколько дочерних классов. Я хочу динамически создавать дочерние объекты разных классов в зависимости от ввода.

Предполагается, что родительский объект объявлен следующим образом:

class Parent {
public:
    Parent(int v);
};

ChildOnE и ChildTwo оба наследуют Parent , Есть ли ярлык для следующего:

shared_ptr<Parent> myObject;
switch(input) {
    case 1: {
        myObject = make_shared<ChildOne>(int v);
        break;
    }
    case 2: {
        myObject = make_shared<ChildTwo>(int v);
        break;
    }
}

Это довольно тяжело при работе с более чем двумя дочерними элементами, особенно когда конструкторы создаются одинаково. Разве мы не можем каким-то образом воспроизвести поведение чисто виртуального конструктора, чтобы все потомки могли его реализовать, а затем изменить только вызываемый класс, но не параметры?

TL; DR Как я могу сократить вышеупомянутый пример?

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете создать таблицу поиска; что-то вроде:

using Ctor = shared_ptr<Parent>(int v);

static const std::map<int, Ctor *> ctors = {
    {1, (Ctor *)make_shared<ChildOne>}, // The cast chooses overload;
    {2, (Ctor *)make_shared<ChildTwo>}, // not sure is that necessary in such context
};

...
return (ctors.at(input))(v);

Самое замечательное в том, что, хотя конструктор особенный и его адрес не может быть получен, make_shared - это обычный указатель на функцию, который можно свободно передавать.

...