Помогите разобраться с ошибками. C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SeoBee, 3 Nov 2012.

  1. SeoBee

    SeoBee New Member

    Joined:
    9 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Задание:
    Смоделировать стек на базе статического массива по заданию. Написать основные операции для работы со стеком (push, pop, top, empty, full) . Для этого (если в задании не указан иной способ) в программе на входе задать последовательность из К (К> 10) целых чисел (числа вводить с клавиатуры). Все положительные числа последовательно заносить в стек, а каждое отрицательное число должно изымать из стека один элемент. Отобразить динамику содержания стека при обработке заданной последовательности. Входную последовательность чисел задать такой, чтобы она демонстрировала работу основных операций и генерировала возникновения ситуаций "потери значимости стека" (stack underflow) и "переполнение стека" (stack overflow).
    Примечание: после реализации стека работать с ним как с абстрактным типом данных, а не как с массивом.

    Написать программу для последовательного хранения двух стеков в массиве из N элементов (стеки размещаются друг за другом: первая половина массива - первый стек, вторая половина массива - второй стек). На входе задаются пары целых чисел (i, j), 1  i  2. Число j пары (i, j) с j> 0 добавляется в i-й стек; число j пары (i, j), с j <= 0, не используется, но и-го стека изымается один элемент. После обработки всей заданной входной последовательности определить наибольший элемент каждого стека.


    Код программы:
    Code:
    #include <iostream>
    #include <locale>
    #include <windows.h>
    #include <cassert>
    using namespace std;
    
    template <class T>
    class MyStack
    {
    protected:
    	T *massive;
    	int size_row;
    
    public:
    	MyStack():size_row(0){};
    	MyStack(int row){
    		size_row=row;
    		massive=new T [size_row];
    	};
    	~MyStack(){delete [] massive;};
    	
    	virtual bool full();
    	virtual void push(T obj=0);
    	virtual bool empty();
    	virtual void viewStack();
    	virtual T top();
    	virtual void pop();
    	virtual T maxValue();
    };
    //-------------------------------------------------------------------
    template <class T>
    class Stack1: public MyStack <T>
    {
    protected:
    	int index1;
    
    public:
    	Stack1(){
    		index1=0;
    	};
    	~Stack1();
    
    	virtual bool full(){
    		if(index1==(this->size_row/2)) return true;
    		else return false;
    	}
    	virtual void push(T obj){
    		if(full()){
    			cout<<"\nstack1 overflow";
    			index1--;
    		}
    		else this->massive[index1++]=obj;
    	}
    	virtual bool empty(){
    		if(index1==0) return true;
    		else return false;
    	}
    	virtual void viewStack(){
    		for(int k=0;k<index1;k++){
    			cout<<"Stack2: "<<this->massive[k]<<" ";
    		}
    		cout<<endl;
    	}
    	virtual T top(){
    		return this->massive[index1-1];
    	}
    	virtual void pop(){
    		if(empty()) cout<<"stack1 underflow";
    		else --index1;
    	}
    	virtual T maxValue(){
    		T tmp;
    		tmp=this->massive[index1];
    		for(int k=index1-1;k>=0;k--){
    			if(this->massive[k]>tmp) tmp=this->massive[k];
    		}
    		return tmp;
    	}
    };
    //-------------------------------------------------------------------
    template <class T>
    class Stack2: public MyStack <T>
    {
    protected:
    	int index2;
    
    public:
    	Stack2(){
    		index2=MyStack<T>::size_row/2;
    	};
    	~Stack2();
    
    	virtual bool full(){
    		if(index2==this->size_row) return true;
    		else return false;
    	}
    	virtual void push(T obj){
    		if(full()) cout<<"\nstack2 overflow";
    		else this->massive[index2++]=obj;
    	}
    	virtual bool empty(){
    		if(index2==(this->size_row/2)) return true;
    		else return false;
    	}
    	virtual void viewStack(){
    		for(int k=MyStack<T>::size_row/2;k<index2;k++){
    			cout<<"Stack1: "<<this->massive[k]<<" ";
    		}
    		cout<<endl;
    	}
    	virtual T top(){
    		return this->massive[index2-1];
    	}
    	virtual void pop(){
    		if(empty()) cout<<"stack2 underflow";
    		else --index2;
    	}
    	virtual T maxValue(){
    		T tmp;
    		tmp=this->massive[index2];
    		for(int k=index2-1;k>=size_row/2;k--){
    			if(this->massive[k]>tmp) tmp=this->massive[k];
    		}
    		return tmp;
    	}
    };
    //-------------------------------------------------------------------
    //-------------------------------------------------------------------
    void main()
    {
    	setlocale(LC_CTYPE,"Russian");
    
    	int N, i, j;
    	cout<<"Введите N: ";
    	cin>>N;
    
    	MyStack <int> massive(N);
    	Stack1 <int> set1;
    	Stack2 <int> set2;
    	for(int k=0;k<N;k++){
    		cout<<"Введите пару чисел i, j: ";
    		cin>>i>>j;
    		assert(i==1 || i==2);
    		if(i==1){
    			if(j>0) set1.push(j);
    			if(j<=0) set1.pop();
    			set1.viewStack();
    		}
    		if(i==2){
    			if(j>0) set2.push(j);
    			if(j<=0) set2.pop();
    			set2.viewStack();
    		}
    	}
    	cout<<"Максимальное значение Stack1: "<<set1.maxValue()<<endl;
    	cout<<"Максимальное значение Stack2: "<<set2.maxValue()<<endl;
    }
    
    Ошибки:
    Code:
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall MyStack<int>::push(int)" (?push@?$MyStack@H@@UAEXH@Z)"
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual bool __thiscall MyStack<int>::empty(void)" (?empty@?$MyStack@H@@UAE_NXZ)"
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall MyStack<int>::viewStack(void)" (?viewStack@?$MyStack@H@@UAEXXZ)"
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall MyStack<int>::top(void)" (?top@?$MyStack@H@@UAEHXZ)"
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall MyStack<int>::pop(void)" (?pop@?$MyStack@H@@UAEXXZ)"
    1>Исходный код.obj : error LNK2001: неразрешенный внешний символ ""public: virtual int __thiscall MyStack<int>::maxValue(void)" (?maxValue@?$MyStack@H@@UAEHXZ)"
    1>Исходный код.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack1<int>::~Stack1<int>(void)" (??1?$Stack1@H@@QAE@XZ) в функции _main
    1>Исходный код.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Stack2<int>::~Stack2<int>(void)" (??1?$Stack2@H@@QAE@XZ) в функции _main
    Подскажите пожалуйста из-за чего эти ошибки?