Как объявить объект общего абстрактного класса без указания типа шаблона - PullRequest
2 голосов
/ 23 мая 2019

У меня проблемы с изучением дженериков на C ++.

То, чего я пытаюсь достичь, это иметь абстрактный обобщенный класс

template <typename T>
class MediaEditor {
    public: virtual ~MediaEditor() = default;
}

Затем 2 класса, которые расширяют его

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

Затем в моей функции main () я хочу объявить указатель типа MediaEditor следующим образом:

MediaEditor* editor;

Поскольку это абстрактный класс, я думал, что указывать тип не нужно, но gcc доказал, что я неправ, сказав, что я должен указать аргументы типа.

Значит, он ожидает, что я объявлю это так:

MediaEditor<SomeType>* editor;

Но суть того, что я пытаюсь сделать, заключается не в том, чтобы указывать эти аргументы, а в дальнейшем использовать, например:

editor = new ImageEditor();

Ребята, вы не представляете, как я могу это сделать?

1 Ответ

1 голос
/ 23 мая 2019

То, что вы хотите сделать, напрямую невозможно, потому что эти два

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

- совершенно не связанные типы. Также MediaEditor<TypeA> и MediaEditor<TypeB> - это два совершенно разных типа. Наличие экземпляров одного и того же шаблона не накладывает никакого отношения на типы (кроме случаев создания экземпляров одного и того же шаблона).

Если вам нужен полиморфизм, решение будет таким же, как и без шаблонов: используйте общий базовый класс:

class MediaEditorBase {};

template <typename T>
class MediaEditor : MediaEditorBase {}

Теперь вы можете сделать

MediaEditorBase* x = new MediaEditor<int>();

PS: «дженерики в C ++», строго говоря, в C ++ нет «дженериков». Они называются шаблонами и их не следует путать, например, с дженериками Java. Это две довольно разные концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...