Параметр глобальной функции - PullRequest
0 голосов
/ 11 сентября 2018

Я строю стек с использованием массивов (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 голосов
/ 11 сентября 2018

Если это должен быть глобальный метод, который служит конструктором, тогда вы можете сделать следующее: внутри 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;
}

И с простым основным методом вы можете иметь:

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

Надеюсь, это решит вашу проблему. Помните, что могут быть некоторые угловые случаи, которые вам нужно будет решить, но в качестве основы я думаю, что этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...