全局功能参数

时间:2018-09-11 08:53:49

标签: c++ methods

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

1 个答案:

答案 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);
}

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