【问题标题】:Global Function Parameter全局函数参数
【发布时间】:2018-09-11 08:53:49
【问题描述】:

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

【问题讨论】:

  • 如果begin == end 则中间没有元素
  • @user463035818 不,我不是在问方法是否正确,我是在问如果堆栈不是方法中的参数,我应该如何调用堆栈上的方法
  • 顺便说一句,您的前提似乎很随意。我可以理解您不能使用std::vector,但是为什么它必须是充当构造函数而不是构造函数的免费方法?为什么不能将堆栈传递给方法?
  • 那么这个问题比我最初想象的还要不清楚;)。如果你不能传递堆栈,那么你就不能调用它的方法。
  • 鉴于限制,没有其他方法可以让 stack&lt;int&gt; sp 成为全局变量。

标签: c++ methods


【解决方案1】:

如果它必须是作为构造函数的全局方法,那么你可以做的是: 在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);
}

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

【讨论】:

  • 你必须以这种方式在stack.cpp中声明construct的所有实例化。
  • 是的,你说得对。虽然这个设计很不自然,所以还是用普通的模板化构造函数就好了:)
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多