【发布时间】:2019-06-23 07:55:02
【问题描述】:
我有两个完全相同的函数,除了其中一个使用stack 进行操作,另一个使用queue:
void doQueue()
{
std::queue<int> q;
...
...
q.push(someValue);
...
...
int tmp = q.front();
q.pop()
}
void doStack()
{
std::stack<int> s;
...
...
s.push(someValue);
...
...
int tmp = s.top();
s.pop()
}
我想消除重复代码。由于queue 使用front 函数检索第一个值,stack 使用top 函数,我认为模板可能不起作用,因为必须调用不同名称的函数。
我的另一个想法是创建一个接口,该接口将作为两种数据结构的包装器,我可以传递我需要的那个。:
class Data
{
public:
virtual void push(const int v) = 0;
virtual int pop() = 0;
};
class StackData : public Data
{
private:
std::stack<int> _stack;
public:
virtual void push(const int v) {_stack.push(v);}
virtual int pop()
{
int ret = _stack.top();
_stack.pop();
return ret;
}
};
class QueueData : public Data
{
private:
std::queue<int> _queue;
public:
virtual void push(const int v) {_queue.push(v);}
virtual int pop()
{
int ret = _queue.front();
_queue.pop();
return ret;
}
};
void doData(Data& dataType)
{
...
dataType.push(someValue);
...
int tmp = dataType.pop();
}
void doQueue()
{
QueueData queueData;
doData(queueData);
}
void doStack()
{
StackData stackData;
doData(stackData);
}
但我认为应该有一种更简单更好的方法来执行此操作。
【问题讨论】: