PDA

Visualizza la versione completa : [C++] Errore di "dependency dropped"


lacchiappasogni
04-01-2012, 16:03
Ciao a tutti!
Ho un problema che non riesco a risolvere,spero davvero che possiate aiutarmi. Ho creato una struttura dati pila con vettore. Ma quando compilo mi dà sempre questo errore: "Circular pilavet <- pilavet.o dependency dropped. creating pilavet.a No such file." Sarò grato a chi mi darà una mano! Eccovi il codice:

pila.h


#ifndef pila_h
#define pila_h
#include <iostream>

using namespace std;

template <class tipoelem>
class pila {
public:
virtual void creapila()=0;
virtual bool pilavuota()=0;
virtual tipoelem leggipila()=0;
virtual void fuoripila()=0;
virtual void inpila(tipoelem)=0;
};

#endif


pilavet.h


#ifndef pilavet_h
#define pilavet_h
#include <iostream>
#include <stdlib>

#include "pila.h"
#include "nodopila.h"

using namespace std;
const int maxlung=100;

template <class tipoelem>
class pilavet: public pila<tipoelem> {

typedef typename pilavet<tipoelem>::nodopila<tipoelem> nodo;

public:
pilavet();
pilavet(int);
void creapila();
bool pilavuota();
tipoelem leggipila();
void fuoripila();
void inpila(tipoelem);
private:
nodo pilap[maxlung];
int testa;
int dimpila;
}
#endif

template <class tipoelem> //COSTRUTTORE CON DIM FISSA
pilavet<tipoelem>::pilavet() {
dimpila=maxlung;
creapila();
}

template <class tipoelem> //COSTRUTTORE CON DIM IN INPUT
pilavet<tipoelem>::pilavet(int dimensione) {
dimpila=dimensione;
creapila();
}

template <class tipoelem> //CREAPILA
pilavet<tipoelem>::creapila() {
testa=0;
}

template <class tipoelem> //PILAVUOTA
bool pilavet<tipoelem>::pilavuota() {
return (testa==0);
}

template <class tipoelem> //LEGGIPILA
tipoelem pilavet<tipoelem>::leggipila() {
if (testa != 0)
return (pilap[testa-1].leggielem() );
}

template <class tipoelem> //FUORIPILA
void pilavet<tipoelem>::fuoripila() {
if (!pilavuota())
testa= testa-1;
else
cout<<"La pila e' vuota\n";
}

template <class tipoelem> //INPILA
void pilavet<tipoelem>::inpila (tipoelem elem) {
if (testa==maxlung)
cout<<"Non ci sono spazi liberi\n";
else {
pilap.scrivielem(elem);
testa++;
}

}

shodan
04-01-2012, 16:58
Perché questo:


typedef typename pilavet<tipoelem>::nodopila<tipoelem> nodo;

se nodopila lo includi?
Non è una classe nested di pilavet.

lacchiappasogni
04-01-2012, 17:03
Ho dimenticato di aggiungervi anche il codice di nodopila:



#ifndef nodopila_h
#define nodopila_h
#include <iostream>

using namespace std

template <class T>

class nodopila {
public:
nodopila();
T leggielem();
void scrivielem(T);
private:
T elemento;

};

template <class T> //COSTRUTTORE
nodopila<T>::nodopila() {
elemento=0;
}

template <class T> // LEGGIELEM
T nodopila<T>::leggielem() {
return elemento;
}

template <class T> //SCRIVIELEM
void nodopila<T>::scrivielem(T elem) {
elemento=elem;
}
#endif



E' da poco che programmo quindi non so molto,infatti non ho capito cosa sia una classe nested. E' comunque era mio intento creare ereditarietà.

shodan
04-01-2012, 17:13
Una classe nested è una classe definita all'interno di un'altra classe.


class Qualcosa {

class Dato {

};
};


Dal momento che nodopila è definita esternamente a pilavet, il tuo typedef è sbagliato.
E' sufficiente:


typedef nodopila<tipoelem> nodo;

Poi, manca un ; alla fine di pilavet e l'#endif andrebbe spostato alla fine del file dal momento che anche le funzioni sono parte dell'header file pilavet.h

lacchiappasogni
04-01-2012, 18:09
Intanto ti ringrazio tanto per gli aiuti che mi stai dando. Ho apportato le correzioni che mi hai detto però, purtroppo, quel maledetto errore c'è sempre! :(

shodan
04-01-2012, 18:26
Prova a commentare creapila() nei costruttori di pilavet e vedi se compila.

E poi:


template <class tipoelem> //INPILA
void pilavet<tipoelem>::inpila (tipoelem elem) {
if (testa==maxlung)
cout<<"Non ci sono spazi liberi\n";
else {
pilap[ che indice? ].scrivielem(elem);
testa++;
}

}

Loading