C++, идиома Opaque Pointer и паттерн Стратегия

75
24 сентября 2021, 17:10

Подскажите, пожалуйста, возможно ли в C++ следующее:

something.cpp:

#include <memory>
// Base - полный тип.
#include "Base.hpp"    
std::unique_ptr<Base> create_derived()
{
    // Derived - неполный тип, наследник класса Base.
    class Derived;
    return std::make_unique<Derived>();
}

Я хочу сконструировать std::unique_ptr<Derived> и вернуть это в виде std::unique_ptr<Base>. При этом, я бы не хотел включать заголовочный файл с полным описанием типа Derived в единицу трансляции something.cpp.

Но я получаю от компилятора сообщение примерно следующего содержания:

Отсутствует оператор =, соответствующий этим операндам: std::unique_ptr<Base> = std::unique_ptr<Derived>.

Я так полагаю, это происходит из-за того, что в данном случае тип Derived является неполным?

Answer 1

Это невозможно по двум причинам,

1) Присваивание std::unique_ptr<Base> значения std::unique_ptr<Derived> невозможно без полного определения Derived, т.к. надо убедиться что Derived это наследник Base.

Об этом и говорит сообщение компилятора.

2) std::make_unique<Derived>() делает new Derived(), а это невозможно без полного определения Derived, т.к. должен быть виден конструктор по-умолчанию.

READ ALSO
Автовоспроизвидение видео в Ios Safari

Автовоспроизвидение видео в Ios Safari

Делаю стриминг сервис для вебинаровКогда пользователь заходит на страницу, он видит таймер и когда таймер подходит к концу - мне надо запустить...

96
Не работают кнопки слайдера

Не работают кнопки слайдера

Хотел сделать, чтобы при нажатии на стрелки класс -active переходил к предыдущей, либо к следующей кнопке slider__btnИ при нажатии на не активную кнопку...

76
Как остановить вращение в нужном месте?

Как остановить вращение в нужном месте?

Всем привет, делаю колесо фортуны, вращение примитивно:

74
Как сделать такой hover эффект при наведении на изображение?

Как сделать такой hover эффект при наведении на изображение?

Ребята как сделать такой hover эффект при наведение мыши?

294