如何在不指定模板类型的情况下声明通用抽象对象 class
How to declare an object of generic abstract class without specifying template type
我在学习 C++ 中的泛型时遇到了一些问题。
我想要实现的是拥有一个抽象泛型 class
template <typename T>
class MediaEditor {
public: virtual ~MediaEditor() = default;
}
然后 2 个 class 扩展它
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
然后在我的 main() 中,我想像这样声明一个 MediaEditor 类型的指针:
MediaEditor* editor;
因为它是一个抽象 class,我认为不需要指定类型,但 gcc 告诉我必须指定类型参数,证明我错了。
所以他希望我这样声明:
MediaEditor<SomeType>* editor;
但我想要做的重点是不必指定这些参数并在以后使用例如:
editor = new ImageEditor();
你们知道我该怎么做吗?
你想做的事情直接做不到,因为那两个
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
是完全不相关的类型。另外MediaEditor<TypeA>
和MediaEditor<TypeB>
是两种完全不同的类型。作为同一模板的实例化不会对类型施加任何关系(除了作为同一模板的实例化)。
如果你想要多态,解决方案和没有模板一样:使用公共基class:
class MediaEditorBase {};
template <typename T>
class MediaEditor : MediaEditorBase {}
现在你可以做
MediaEditorBase* x = new MediaEditor<int>();
PS:"generics in C++",严格来说C++没有"generics"。它们被称为模板,不应与 Java 泛型等混淆。这是两个截然不同的概念。
我在学习 C++ 中的泛型时遇到了一些问题。
我想要实现的是拥有一个抽象泛型 class
template <typename T>
class MediaEditor {
public: virtual ~MediaEditor() = default;
}
然后 2 个 class 扩展它
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
然后在我的 main() 中,我想像这样声明一个 MediaEditor 类型的指针:
MediaEditor* editor;
因为它是一个抽象 class,我认为不需要指定类型,但 gcc 告诉我必须指定类型参数,证明我错了。
所以他希望我这样声明:
MediaEditor<SomeType>* editor;
但我想要做的重点是不必指定这些参数并在以后使用例如:
editor = new ImageEditor();
你们知道我该怎么做吗?
你想做的事情直接做不到,因为那两个
class ImageEditor: public MediaEditor<TypeA> {}
class VideoEditor: public MediaEditor<TypeB> {}
是完全不相关的类型。另外MediaEditor<TypeA>
和MediaEditor<TypeB>
是两种完全不同的类型。作为同一模板的实例化不会对类型施加任何关系(除了作为同一模板的实例化)。
如果你想要多态,解决方案和没有模板一样:使用公共基class:
class MediaEditorBase {};
template <typename T>
class MediaEditor : MediaEditorBase {}
现在你可以做
MediaEditorBase* x = new MediaEditor<int>();
PS:"generics in C++",严格来说C++没有"generics"。它们被称为模板,不应与 Java 泛型等混淆。这是两个截然不同的概念。