全局函数参数

Global Function Parameter

本文关键字:参数 函数 全局      更新时间:2023-10-16

我正在使用数组构建堆栈(不允许使用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();

如果它必须是用作构造函数的全局方法,那么您可以做的是: 在类stack.h内部插入此全局方法的友元声明,如下所示:

template <typename T>
class stack {
template <typename U, typename IterIt>
friend stack<U> construct(IterIt beg, IterIt end);
private:
T* inside_;
};

在堆栈中.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;
}

使用简单的主方法,您可以拥有:

int main() {
int a[] = {1,2,3,4,5};
stack<int> s = construct<int>(a, a + 5);
}

我希望这能解决你的问题。请记住,您可能需要解决一些极端情况,但作为基线,我认为这应该足够了。