【问题标题】:Wrap different std::vector<T> in same interface在同一接口中包装不同的 std::vector<T>
【发布时间】:2020-01-06 06:27:10
【问题描述】:

我有 2 个类用于管理 2 个不同类型的队列(形式为 list&lt;myType1*&gt;list&lt;myType1*&gt;)。 为了简化情况,我们可以在这里使用std::vector&lt;std::string&gt;std::vector&lt;int&gt;,如下例所示:

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 基类,但只能派生几个函数(上例中的count()),因为m_queue 对象不同,即使函数(addclear、等等...)是一样的。 即使std::vector元素不同,是否有可能有完整的函数继承?

我在想这样的事情:

class Queue
{

public:
    Queue();
    ~Queue();

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

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

有没有办法做到这一点?

【问题讨论】:

  • 有人能这么好心地解释一下反对票吗?
  • 我想知道你为什么不使用类的模板版本!!有什么好的理由避免这种情况吗?
  • 查看任何 std::stack 或 std::priority_queue 实现。它是您想要的容器包装器。此外,永远不要从任何 STL 容器继承。
  • 如果您不想从容器继承,您希望人们通过“从 std::vector 继承”来理解什么?
  • @Ayxan 多态并不是继承的唯一目的。从非虚拟基类继承完全没问题,只是你不能多态地使用这样的类。

标签: c++ inheritance


【解决方案1】:

这是模板的完美工作:

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++ 编写模板化代码有其自身的挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2019-11-07
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多