Как вы вызываете невиртуальные, неконстантные методы производного класса из unique_ptr в базу?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как вы вызываете невиртуальные, неконстантные методы производного класса из unique_ptr в базу?

Сообщение Anonymous »

У меня есть шаблон фабрики, в котором хранится ряд различных производных классов в карте unique_ptr в базу:

Код: Выделить всё

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{};
};
Я пытался получить доступ к производному классу, приведя возвращаемый указатель и затем вызвав метод, но это привело к сбою сегмента, когда метод пытается изменить размер _data.< /p>

Код: Выделить всё

    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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»