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è
codice:
g++ -c nomefile.cpp
va a buon fine, ma quando successivamente tento di creare l'eseguibile,
codice:
g++ -o nomefile.exe nomefile.o
, ricevo degli errori che, per via dell'inesperienza non riesco a comprendere.
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"