在同一接口中包装不同的std :: vector <T>

时间:2019-09-03 10:46:25

标签: c++ inheritance

我有2个类来管理2个不同类型的队列(以list<myType1*>list<myType1*>的形式)。 为了简化这种情况,我们可以在此处使用std::vector<std::string>std::vector<int>,如下例所示:

class StringQueue
{

public:
    StringQueue();
    ~StringQueue();

    int count() const {return m_queue.size();}
    void add(std::string item) {m_queue.push_back(item);}
    void clear() {m_queue.clear();}
    ...etc...

protected:
    std::vector<std::string> m_queue;
};

class IntQueue
{

public:
    IntQueue();
    ~IntQueue();

    int count() const {return m_queue.size();}
    void add(int item) {m_queue.push_back(item);}
    void clear() {m_queue.clear();}
    ...etc...

protected:
    std::vector<int> m_queue;
};

对于每个Queue类,我都有许多访问队列的功能(添加,清除,计数,检查,弹出一个,弹出多个,等等)

看看代码,我现在的问题是:可以在这里使用继承吗? 我知道我可以实现一个Queue基类,但是由于m_queue对象是不同的,因此即使函数({{1} },count()等)。 即使add元素不同,也可能具有完整的函数继承吗?

我在想类似的东西:

clear

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

这是模板的完美工作:

template<class T>
class MyQueue
{
public:
    MyQueue();
    ~MyQueue();

    int count() const {return m_queue.size();}
    void add(T item) {m_queue.push_back(item);}
    void clear() {m_queue.clear();}
    T popOne()
    {
      T front = m_queue.front();
      m_queue.erase(m_queue.begin());
      return front;
    }
    ...etc...

protected:
    std::vector<T> m_queue;
};

出于您确定自己的原因,继承不是工作的正确工具。

但是:

  1. 您为什么不使用std::queue和朋友,它们已经完成了这种包装?
  2. 您为什么要基于std::vector建立队列-从前端擦除元素需要将每一个其他元素向前移动一个插槽。那差不多要贵了...

如果您想进一步使用模板,建议您阅读更多有关模板的内容。上面的代码看起来很简单,但是用C ++编写模板代码却面临着一系列挑战。