不同类型的类

Posted

技术标签:

【中文标题】不同类型的类【英文标题】:Class with different types 【发布时间】:2016-03-15 15:09:02 【问题描述】:

我正在开发一个 C++ ROS 项目,其中包含不同的类,每个类都包含一个向量。

困难在于向量可以是不同的类型。例如:

class A
    public
        .....
    private 
        std::vector<Class_C> List

class B
    public  
        .....
    private 
        std::vector<Class_D> List

我怎样才能完成这样的任务?我想找到一种使用模板、继承和其他语言特性来简化代码的方法。

【问题讨论】:

问题不清楚 您打算如何处理这些列表?所有其他类的目的是什么? 【参考方案1】:

只需使用模板参数:

template <typename T>
class A
    public
        .....
    private 
        std::vector<T> List;

这允许A 拥有任何类型的vector

A<Class_C> foo;
A<Class_D> bar;

【讨论】:

如果我想要一个继承自 A 的 B 类,是否可以锁定类型?如果 B 类只能有“Class_C”作为类型名,例如 @S.Perfees 也许你应该重新考虑你在做什么。 "Composition over inheritance"【参考方案2】:

由于我的声誉我无法发表评论,我必须写一个答案,但Gill Bates' answer 可以解决你的问题,即使 你不清楚你想要完成什么。为了扩展他的答案,您可以使用基于他的模板类的继承来简化您的编码并将类型强制放入您的列表中(在这种情况下,您还需要将列表可见性更改为受保护):

class FooInt : public A<int>
    public
        void print()  /* print List's content */ 
...
;

class FooString : public A<std::string>
    public
        void print()  /* print List's content */ 
...
;

你是这样使用你的类的:

FooInt hello;
hello.print(); // Would print list of int

FooString moto;
moto.print(); // Would print list of string

请注意,类的名称写为 Foo* 只是为了帮助您了解它们的底层列表将包含名称中写入的类型,这可能是您的 B 类继承自 A 类...

【讨论】:

【参考方案3】:

这就是你要找的吗?

template <typename T>
class A 
    public:
        .....
    protected: 
        std::vector<T> List;
;

class B : public A<Class_D> 
    public:
    .....
;

B b;

【讨论】:

以上是关于不同类型的类的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的类类型 ArrayList 中使用相同的方法?

通过 Symfony/Console 创建不同类型的类

如何让一个由 ControllerAdvice 注释的类来处理不同类型的异常?

这个 Hibernate 图中的类和接口之间的不同类型的箭头是啥意思?

可以是类型或工厂函数的类成员的不同行为

静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。