【问题标题】: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
}

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

【问题讨论】:

  • 问题不清楚
  • 您打算如何处理这些列表?所有其他类的目的是什么?

标签: c++ class inheritance vector


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      相关资源
      最近更新 更多