我有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
有没有办法做到这一点?
答案 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;
};
出于您确定自己的原因,继承不是工作的正确工具。
但是:
std::queue
和朋友,它们已经完成了这种包装?std::vector
建立队列-从前端擦除元素需要将每一个其他元素向前移动一个插槽。那差不多要贵了... 如果您想进一步使用模板,建议您阅读更多有关模板的内容。上面的代码看起来很简单,但是用C ++编写模板代码却面临着一系列挑战。