Код: Выделить всё
class ForceFactory {
private:
using BuilderFunc = std::function;
const std::unordered_map builders = {
{"DerivedForceA", build_a},
{"DerivedForceB", build_b},
{"DerivedForceC", build_c}
};
std::unordered_map forces;
public:
// Build call for pre-defined, derived Forces
const std::unique_ptr& build(const std::string& force) {
if (forces.count(force) == 0) {
forces[force] = builders.at(force)();
}
return forces[force];
}
};
Код: Выделить всё
class Force {
public:
Force() = default;
~Force() = default;
virtual std::array compute_force(...) const = 0;
};
Код: Выделить всё
std::unique_ptr build_derived() { return std::make_unique(); }
Код: Выделить всё
class DerivedForce : public Force {
public:
DerivedForce() = default;
~DerivedForce() = default;
std::array compute_force(...) const override;
void set_coefficients(...); // modifies _data
private:
mutable std::vector _data{};
};
Код: Выделить всё
auto& baseRef = forces["DerivedForce"];
auto* basePtr = baseRef.get();
auto* derivedPtr = static_cast(basePtr);
derivedPtr->set_coefficients(...); // segfaults at call to _data.resize(...)
Причина Я использую эту парадигму построителя вместо инициализации каждого из производных классов и вызова любых методов, подобных этому, перед сохранением их как уникальных. Я хочу, чтобы любые производные классы, не определенные пользователями, создавались без необходимости их инициализации вручную.< /p>
Возможно ли это вообще? Будут ли модификации производного класса просто удалены, как только он будет преобразован в базовый класс? Я упускаю из виду, как и когда использовать полиморфизм? Будем очень признательны за любые рекомендации.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ique-ptr-t
Мобильная версия