2017-02-16 2 views
0

Прежде чем вы отметите этот вопрос как дубликат, поймите, что я действительно посмотрел сообщение this и другие подобные на сайте. Моя проблема заключается не в понимании того, как переменные области и/или препроцессор работают. У меня их нет.Переменная C++, не объявленная в области

Я не могу понять эту неприятную проблему в моем коде. Я просто пытаюсь смоделировать структуру данных стека с помощью C++. Компилятор продолжает жаловаться, что size и capacity не были объявлены в этой области (для Stack.cpp). Есть три файла:

  • Stack.h
  • Stack.cpp
  • main.cpp

Ниже приведены фрагменты кода для заголовка файла и файл .cpp:

Stack.h

#ifndef STACK_H_ 
#define STACK_H_ 


#include <iostream> 
#include <string> 


using namespace std; 


template<typename T> 
class Stack 
{ 
    public: 
     Stack(); 
     void push(T item); 
     T pop(); 

    private: 
     int size; 
     const int capacity = 10; 
     T items[]; 
}; 


#endif 

Stack.cpp

#include "Stack.h" 

using namespace std; 

template<typename T> 
Stack::Stack() : items[capacity] 
{ 
    size = 0; 
} 


template<typename T> 
void Stack::push(T item) 
{ 
    if(size == capacity) 
    { 
     cout << "No more room left. Unable to add items."; 
    } 
    else 
    { 
     items[size-1] = item; 
     size++; 
    } 
} 


template<typename T> 
T Stack::pop() 
{ 
    if(size == 0) 
    { 
     cout << "Stack is empty. There is nothing to remove."; 
    } 
    else 
    { 
     size--; 
    } 
} 

Компилятор также странно жалуется, что «„шаблон класса Stack“используется без параметров шаблона аннулируются Stack :: толчок (T элемент)», который не имеет особого смысла, видя как я использовал заголовок шаблона перед функцией-членом.

Может кто-то прояснить, что я сделал неправильно?

+1

http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file направит вас в лучшем направлении. Также шаблонное имя-типа - Stack . –

ответ

0

Компилятор также странно жалуется, что «„шаблон класса Stack“ без параметров шаблона аннулируются Stack :: толчок (T) пункт»

Я думаю, что компилятор пытается сказать вам, что в файл cpp, который вы использовали Stack, где вы должны были использовать Stack<T>. Например, ваша push декларация должна выглядеть следующим образом ...

template<typename T> 
void Stack<T>::push(T item) 
// ... etc ... 
1

Я прошел через вашу проблему, фиксированные несколько проблем и оптимизирована (только рекомендация), так:

  1. Первая проблема заключалась в том, что вам шаблоны весь класс не только отдельные функции, другие ответили ранее. Поэтому вам нужно использовать список шаблонов с каждой функцией, кроме конструктора.
  2. Вторая проблема возникает, когда вы исправляете первый, компилятор не компилирует код, потому что вы используете отдельные файлы для определения и реализации (вы не можете сделать это с шаблонами, по крайней мере, не обычным способом Explanation).
  3. В-третьих, и последняя проблема возникает в поп-функциях, поскольку она определяется таким образом, что она должна что-то возвращать, а в теле ничего не вернуть (мое изменение - просто временное исправление).
  4. Исправлено изменение размера в толчке.

Теперь оптимизации:

  1. Удалены с использованием патезраса. Explanation
  2. Измененная емкость, которую пользователь настраивает (по крайней мере, при создании экземпляра).
  3. Измененный массив элементов в std :: unique_ptr умный указатель, указывающий на динамически созданный массив.
  4. Добавлен список инициализаторов членов для конструктора.

Код (Stack.h):

#ifndef STACK_H_ 
#define STACK_H_ 

#include <iostream> 
#include <memory> // for unique_ptr 

//using namespace std; // it is better to not use using namespace, for avoiding of problems in the future 

template<typename T> 
class Stack { 
public: 
    Stack(const unsigned int& capacity = 10); // usually stacks are defined with user settable capacity 
    void push(T item); 
    T pop(); 
private: 
    unsigned int size; 
    unsigned int capacity; 
    std::unique_ptr<T[]> items; 
}; 

// such templated functions (below) cannot be implemented in other file 

template<typename T> 
Stack<T>::Stack(const unsigned int& capacity) : 
    capacity(capacity), 
    items(new T[capacity]), 
    size(0) {} 

template<typename T> 
void Stack<T>::push(T item) { 
    if (size == capacity) { 
     std::cout << "No more room left. Unable to add items." << std::endl; 
    } 
    else { 
     items[size++] = item; // you should put item at index size, after that increase it by one 
    } 
} 

template<typename T> 
T Stack<T>::pop() { 
    // for such defined function you need to return something of type T 
    if (size == 0) { 
     std::cout << "Stack is empty. There is nothing to remove." << std::endl; 
     return 0; // maybe return empty object? 
    } 
    else { 
     return items[--size]; // probably return removed object 
    } 
} 

#endif 

Код (main.cpp):

#include "Stack.h" 

int main() { 
    Stack<int> stack; 
    for (int e = 0; e < 11; e++) { 
     stack.push(e); 
    } 
    for (int i = 0; i < 11; i++) { 
     std::cout << stack.pop() << std::endl; 
    } 
    return 0; 
} 

Надеется, что это помогает.

Смежные вопросы