Salve a tutti, come da titolo, ho per la prima volta cercato di fare una misera compilazione di qualche riga di codice in C++, sono giusto tre files per implementare l'utilizzo di uno stack, giusto per capire come funziona il lingiuaggio.
La compilazione fatta "a mano" cioè
va a buon fine, ma quando successivamente tento di creare l'eseguibile,codice:g++ -c nomefile.cpp
, ricevo degli errori che, per via dell'inesperienza non riesco a comprendere.codice:g++ -o nomefile.exe nomefile.o
Di seguito allego i files:
codice:Nome Fie: stack.h #ifndef _STACK_H #define _STACK_H 1 template<class T> class Stack { T* v; static const int max_size = 100; int stack_size; int top; public: class StackOverflow { }; class StackUnderflow { }; class StackBadSize { }; Stack(int size); ~Stack(); void push(T element); T pop(); bool isFull(); bool isEmpty(); int slotsFree(); }; #endif
codice:Nome Fie: stack.cpp #include "stack.h" template<class T> Stack<T>::Stack(int size) { // (costruttore) if(size > 0 && size < max_size) { // se il valore della size è corretto stack_size = size; v = new T[stack_size]; // alloca spazio nella memoria dinamica (heap) top = 0; // inizializza la testa dello stack a 0 } else { // altrimenti throw StackBadSize(); // lancia l'eccezione } } template<class T> Stack<T>::~Stack() { // (distruttore) delete[] v; // dealloca lo spazio di memoria utilizzato } template<class T> void Stack<T>::push(T el) { // (metodo di inserimento) if(top == stack_size) { // se la testa è oltre la dimensione dello stack throw StackOverflow(); // lancia l'eccezione di overflow } else { // altriemnti v[top] = el; // inserisco l'elemento nello stack top++; // incremento top } } template<class T> T Stack<T>::pop() { // (metodo di estrazione) if(top == 0) { // se la testa è già minore di 0 throw StackUnderflow(); // lancia l'eccezione } else { // altrimenti top--; // decremento la testa dello stack return v[top]; // restituisco l'ultimo valore inserito } } template<class T> bool Stack<T>::isFull() { // (metodo per capire se lo stack è pieno) if(top == stack_size) { // se la testa ha lo stesso valore della massima size dello stack return true; // lo stack è pieno } else { // altrimenti return false; // non è pieno } } template<class T> bool Stack<T>::isEmpty() { // (metodo per capire se lo stack è pieno) if(top = 0) { // se la testa ha valore 0 return true; // lo stack è vuoto } else { // altrimenti return false; // non è vuoto } }
codice:Nome Fie: prova_stack.cpp #include <iostream> #include "stack.h" #include <string> using namespace std; int main() { cout << "La parola che verrà inserita e: Rosa.\n"; Stack<char> pila(7); string str; pila.push('a'); pila.push('s'); pila.push('o'); pila.push('R'); str = pila.pop() + pila.pop() + pila.pop() + pila.pop(); cout << "La parola inserita è:" << str << ".\n"; }
Questo è l'errore che ricevo:
codice:D:\MinGW\bin>g++ -o prova_stack.exe prova_stack.o prova_stack.o(.text+0xc3):prova_stack.cpp: undefined reference to `Stack<char>::Stack(int)' prova_stack.o(.text+0xf1):prova_stack.cpp: undefined reference to `Stack<char>::push(char)' prova_stack.o(.text+0x102):prova_stack.cpp: undefined reference to `Stack<char>::push(char)' prova_stack.o(.text+0x113):prova_stack.cpp: undefined reference to `Stack<char>::push(char)' prova_stack.o(.text+0x124):prova_stack.cpp: undefined reference to `Stack<char>::push(char)' prova_stack.o(.text+0x136):prova_stack.cpp: undefined reference to `Stack<char>::pop()' prova_stack.o(.text+0x14b):prova_stack.cpp: undefined reference to `Stack<char>::pop()' prova_stack.o(.text+0x168):prova_stack.cpp: undefined reference to `Stack<char>::pop()' prova_stack.o(.text+0x185):prova_stack.cpp: undefined reference to `Stack<char>::pop()' prova_stack.o(.text+0x321):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()' prova_stack.o(.text+0x358):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()'
Confido in voi per riuscire a capire dove è che sbaglio... anche se più o meno ho capito, non riesco a risolverlo, forse è dovuto al fatto che vengo da una formazione "java"


Rispondi quotando


