Вот еще бы один пример.
Код:
//TSTACK.H
//Простой шаблон класса Stack
#ifndef TSTACK_H
#define TSTACK_H
#include <iostream>
using namespace std;
template <class T>
class Stack
{
public:
Stack(int = 10);
~Stack(){delete [] stackPtr;}
int push(const T&);
int pop(T&);
int isEmpty()const {return top == -1;}
int isFull() const {return top == size - 1;}
private:
int size;
int top;
T *stackPtr;
};
#endif
Код:
//TSTACK.CPP
//Определение функций-элементов класса Stack
#include "TStack.h"
template <class T>
Stack<T>::Stack(int s)
{
size = s > 0 && s < 1000 ? s : 10;
top = -1;
stackPtr = new T[new];
}
template <class T>
int Stack<T>::push(const T &item)
{
if(!isFull())
{
stackPtr[++top] = item;
return 1;
}
return 0;
}
template <class T>
int Stack<T>::pop(T &popValue)
{
if(!isEmpty())
{
popValue = stackPtr[top--];
return 1;
}
return 0;
}
Код:
//MAIN.CPP
#include <iostream>
#include "TStack.h"
int main()
{
setlocale(LC_ALL, ".1251");
Stack<float> floatStack(5);
float f = 1.1;
cout << "Размещение элементов в floatStack" << endl;
while(floatStack.push(f))
{
cout << f << ' ';
f +=1.1;
}
cout << endl << "Стек заполнен. Невозможно разместить "
<< f << endl << endl
<< "Выталкивание элементов из floatStack" << endl;
while(floatStack.pop(f))
cout << f << ' ';
cout << endl << "Стек пуст. Больше нечего вытолкнуть невозможно" << endl;
Stack<int> intStack(5);
int i = 1;
cout << "Размещение элементов в floatStack" << endl;
while(intStack.push(i))
{
cout << i << ' ';
i++;
}
cout << endl << "Стек заполнен. Невозможно разместить "
<< i << endl << endl
<< "Выталкивание элементов из floatStack" << endl;
while(intStack.pop(i))
cout << i << ' ';
cout << endl << "Стек пуст. Больше нечего вытолкнуть невозможно" << endl;
system("pause");
return 0;
}
А самое главное, я сначала все это пропустил и начала после прочтения выполнять задания. Выполнил, вроде все правильно, но компилятор выдает ошибки. Решил вернутся и набрать примеры, может что упустил. Но тут снова ошибки да еще и такие же как у меня. В чем причина?
1>------ Построение начато: проект: Stack, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>c:\$p\mvs\{как программировать на с++}\сотировка_пузырек_сlass\сотировка_пузырек_сlass\main.cpp(11) : warning C4305: инициализация: усечение из 'double' к 'float'
1>c:\$p\mvs\{как программировать на с++}\сотировка_пузырек_сlass\сотировка_пузырек_сlass\main.cpp(17) : warning C4305: +=: усечение из 'double' к 'float'
1>Создание кода...
1>Пропуск... (изменения не обнаружены)
1>TStack.cpp
1>Компоновка...
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<int>::pop(int &)" (?pop@?$Stack@H@@QAEHAAH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<int>::push(int const &)" (?push@?$Stack@H@@QAEHABH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack<int>::Stack<int>(int)" (??0?$Stack@H@@QAE@H@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<float>::pop(float &)" (?pop@?$Stack@M@@QAEHAAM@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Stack<float>::push(float const &)" (?push@?$Stack@M@@QAEHABM@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack<float>::Stack<float>(int)" (??0?$Stack@M@@QAE@H@Z) в функции _main
1>C:\$p\mvs\{как программировать на с++}\Сотировка_пузырек_Сlass\Debug\Stack.exe : fatal error LNK1120: 6 неразрешенных внешних элементов
1>Журнал построения был сохранен в "file://c:\$p\mvs\{как программировать на с++}\Сотировка_пузырек_Сlass\Сотировка_пузырек_Сlass\Debug\BuildLog.htm"
1>Stack - ошибок 7, предупреждений 2
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========