我正在使用数组构建堆栈(不允许使用std :: vector),并且我必须实现一个用作构造函数的全局方法。输入参数是两个迭代器(开始和结束),我必须从中创建一个堆栈。问题是在我实际创建堆栈之前,我必须检查是否为空。由于我无法将堆栈作为参数传递,我该如何调用该方法?
这是我的代码:
template <typename IterT>
void method(IterT begin, IterT end) {
try {
if(!is_empty())
make_empty();
for(; begin!=end; ++begin) {
push(static_cast<T>(*begin));
}
}
catch(...) {
clear();
throw;
}
}
显然不起作用,方法is_empty(),make_empty(),push()和clear()需要一些工作。
我的测试方法是:
int a[5] = {7, 2, 33, 4, 1111};
stack<int> sp;
sp.push(25); //check if stack is made empty
sp.print();
sp.method(a, a+5);
sp.print();
答案 0 :(得分:0)
如果必须是充当构造函数的全局方法,那么您可以做的是:
在stack.h
类内部,为此全局方法插入朋友声明,例如:
template <typename T>
class stack {
template <typename U, typename IterIt>
friend stack<U> construct(IterIt beg, IterIt end);
private:
T* inside_;
};
在stack.cpp中,我们现在可以定义此构造方法:
#include "stack.h"
#include <cstddef>
template <typename T, typename IterIt>
stack<T> construct(IterIt beg, IterIt end) {
// warning: works only with iterators defining binary operator-
stack<T> result;
size_t elems = end - beg;
result.inside_ = new T[elems];
T* add_to = result.inside_;
while (beg != end) {
*add_to = *beg;
++add_to;
++beg;
}
return result;
}
使用简单的main方法,您可以:
int main() {
int a[] = {1,2,3,4,5};
stack<int> s = construct<int>(a, a + 5);
}
我希望这可以解决您的问题。请记住,您可能需要解决一些极端情况,但是作为基线,我认为这已经足够。