TEMPLATE

di il
2 risposte

TEMPLATE

Salve, non riesco a compilare, dovrei realizzare una lista di candidati, ma da problemi di " no matching function for call to 'candidato::candidato() potete aiutarmi?
#include<iostream>
#include<string>
#include<cstdlib>
#include<ctime>
using namespace std;

class candidato
{
	private:
		int v, r, e;
		string codicefiscale;
	public:
		candidato(int _v,int _r, int _e, string cod)
		{
			v=_v;
			r=_r;
			e=_e;
			codicefiscale=cod;
		}
		setV(int V)
		{
			v=v;
		}
		setr(int R)
		{
			r=R;
		}
		setE(int E)
		{
			e=E;
		}
		setString(string str)
		{
			codicefiscale=str;
		}
		bool operator >(const candidato& cand)
		{
			if(v>cand.v)
				return true;
			else if(v==cand.v && r>cand.r)
				return true;
			else if(v==cand.v && r==cand.r && cand.e>e)
				return true;
			else 
				return false;
			
		}
		bool operator <(const candidato& cand)
		{
			if(v<cand.v)
				return true;
			else if(v==cand.v && r<cand.r)
				return true;
			else if(v==cand.v && r==cand.r && cand.e<e)
				return true;
			else 
				return false;
		}
		bool operator >=(const candidato& cand)
		{
			if(v>=cand.v)
				return true;
			else if(v==cand.v && r>=cand.r)
				return true;
			else if(v==cand.v && r==cand.r && cand.e>=e)
				return true;
			else 
				return false;
		}
		bool operator <=(const candidato& cand)
		{
			if(v<=cand.v)
				return true;
			else if(v==cand.v && r<=cand.r)
				return true;
			else if(v==cand.v && r==cand.r && cand.e<=e)
				return true;
			else 
				return false;
		}
		bool operator ==(const candidato& cand)
		{
			if(v==cand.v && r==cand.r && cand.e==e)
				return true;
			else 
				return false;
		}
		bool operator !=(const candidato& cand)
		{
			if(v!=cand.v && r!=cand.r && cand.e!=e)
				return true;
			else 
				return false;
		}
};



template<class T>
class nodo
{
	public:
	T info;
	nodo<T>* succ;
	void setsucc(nodo<T>* x)
	{
		succ=x;
	}		
};
template<class T>
class lista
{
	private:
		nodo<T>* testa;
	public:
		lista()
		{
			testa=NULL;
		}
		nodo<T>* get_testa()
		{
			return testa;
		}
		set_testa(nodo<T>* x)
		{
			testa=x;
		}
		inserisci(T x)
		{
			nodo<T>* temp=testa;
			nodo<T>* nuovo= new nodo<T>;
			nuovo->info=x;
			nuovo->succ=NULL;
			if(testa==NULL)
				testa=nuovo;
			else
			{
				if(temp->info>x)
				{
					nuovo->succ=testa;
					testa=nuovo;
				}
				else
				{
					while(temp->succ!=NULL && temp->succ->info<x)
					{
					
						temp=temp->succ;
					}
					if(temp->succ==NULL)
					{
						temp->succ=nuovo;
					}
				
					else
					{
						nuovo->succ=temp->succ;
						temp->succ=nuovo;
					
					}
				}
			
			}
		}
		nodo<T>* ricerca(T x)
		{
			if(testa==NULL)
			{
				return 0;
			}
			else if(testa!=0 && testa->info==x)
				return testa;
			else
			{
				nodo<T>* temp=testa;
				temp=temp->succ;
				while(temp!=0)
				{
					if(temp->info==x)
						return temp;
					temp=temp->succ;
				}
			}	
		}
		void cancella(T x)
		{
			if(testa==0)
			{
			}
			nodo<T>* temp=testa;
			if(testa->info==x)
			{
				testa=testa->succ;
				delete temp;
			}
			else
			{
				nodo<T>* clone=testa;
				clone=clone->succ;
				while(clone!=0)
				{
					if(clone->info==x)
					{
						temp->succ=clone->succ;
						delete clone;
					}
					clone=clone->succ;
					temp=temp->succ;
				}
			}
		}
		stampa()
		{
			nodo<T>* temp=testa;
			while(temp!=0)
			{
				cout<<temp->info<<"  "<<temp<<endl;
				temp=temp->succ;
			}
		}
		
};
class graduatoria : public lista<candidato>
{
	public:
		graduatoria()
		{
			lista<candidato>();
		}
};





int main()
{
	/*
	lista<int> Lista;
	Lista.inserisci(10);
	Lista.inserisci(3);
	Lista.inserisci(1);
	Lista.inserisci(5);
	Lista.inserisci(4);
	Lista.inserisci(9);
	Lista.inserisci(6);
	Lista.inserisci(2);
	Lista.inserisci(3);
	Lista.inserisci(8);
    Lista.inserisci(7);
	Lista.stampa();
	nodo<int>* a=Lista.ricerca(4);
	cout<<endl;
	Lista.cancella(5);
	Lista.stampa();
	srand(time(0));
	cout<<endl<<endl;*/
	
	candidato *a = new candidato(21,34,70,"GTRSDF94S03C351J");
	candidato *b = new candidato(63, 63, 24,"FGTSER95Y05H351T");
	candidato *c = new candidato(89, 60, 25,"RYUASD93R12E353H");
	graduatoria A;
	A.inserisci(*a);

	return 0;
}

2 Risposte

  • Re: TEMPLATE

    Il problema e' subdolo:

    nodo<T> viene istanziato come nodo<candidato> ed hai il membro "nodo<candidato>::info" di tipo "candidato" NON "candidato * "

    QUINDI

    per poter inizializzare ""nodo<candidato>::info" il compilatore CERCA di usare il costruttore DI DEFAULT ( "candidato()" )

    CHE NON VIENE CREATO in automatico

    perche' tu hai definito un costruttore con parametri.

    E cerca di usare il costruttore PERCHE' tu hai definito un costruttore.
  • Re: TEMPLATE

    Ma io il puntatore nodo<candidato> voglio, perchè mi deve fare l'oggetto? nella classe lista come membro privato un puntatore ho...
    come posso sistemarlo? Il main lo devo lasciare così perchè ci viene detto che non dobbiamo cambiarlo
Devi accedere o registrarti per scrivere nel forum
2 risposte