Problema con classi derivate

di il
4 risposte

Problema con classi derivate

Buon giorno a tutti, mentre stavo facendo un esercizio sulle classe derivate mi imbatto in questo errore (Guardare foto allegata). Vi lascio qui il codice
#include <iostream>
#define pi 3.14
using namespace std;

class figura
{
	protected:
		double perimetro;
		double area;
	public:
		virtual void calcolo_perimetro();
		virtual void calcolo_area();
		void scelta_opzione();
};

class cerchio : public figura //Area e perimetro cerchio
{
	public:
		virtual void calcolo_perimetro();
		virtual void calcolo_area();
		double raggio;
};

class quadrato : public figura
{
	public:
		virtual void calcolo_perimetro();
		virtual void calcolo_area();
		int lato;
};

void figura::scelta_opzione()
{
	cerchio c;
	int scelta;
	cout << "Quale figura ti serve? Inserisci un numero" << endl;
	switch (scelta)
	{
		case 1: //Cerchio
			cout << "Inserisci il raggio della circonferenza: "; cin >>  c.raggio;
			c.calcolo_perimetro();
			c.calcolo_area();
			
	}
}

void cerchio::calcolo_area()
{
	cerchio p;
	
	p.area = (double)p.raggio * (double)p.raggio * pi;
	cout << "L'area della circonferenza e': " << p.area << endl;
}

void cerchio::calcolo_perimetro()
{
	cerchio p;
	p.perimetro = 2 * pi * p.raggio;
	cout << "Il perimetro della circonferenza e': " << p.perimetro << endl;
}

void quadrato::calcolo_area()
{
	quadrato p;
	p.perimetro = p.lato * 4;
}

void quadrato::calcolo_perimetro()
{
	area = lato * lato;
}

int main()
{
	figura p;
	p.scelta_opzione();
}
EDIT: Il problema è questo "C:\Users\Angelo\AppData\Local\Temp\cc4pTGWC.o Esercizio 13.3.cpp:(.rdata$.refptr._ZTV6figura[.refptr._ZTV6figura]+0x0): undefined reference to `vtable for figura'"
Allegati:
26264_ded2738f784dc2b71bebb0a441984079.png
26264_ded2738f784dc2b71bebb0a441984079.png

4 Risposte

  • Re: Problema con classi derivate

    Rivedrei il codice così, per iniziare ...
    
    #include <iostream>
    #define pi 3.14
    using namespace std;
    
    class figura
    {
    public:
    	virtual double calcolo_perimetro() = 0; 
    	virtual double calcolo_area() = 0; 
    };
    
    class cerchio : public figura //Area e perimetro cerchio
    {
    public:
    	double raggio;
    	virtual double calcolo_perimetro();
    	virtual double calcolo_area();
    };
    
    class quadrato : public figura
    {
    public:
    	double lato;
    	virtual double calcolo_perimetro();
    	virtual double calcolo_area();
    };
    
    double cerchio::calcolo_area()
    {
    	return (raggio * raggio * pi);
    }
    
    double cerchio::calcolo_perimetro()
    {
    	return (2 * pi * raggio);
    }
    
    double quadrato::calcolo_area()
    {
    	return (lato * 4.0);
    }
    
    double quadrato::calcolo_perimetro()
    {
    	return (lato * lato);
    }
    
    int main()
    {
    	int scelta;
    	cout << "Quale figura ti serve? Inserisci un numero" << endl;
    	cin >> scelta;
    
    	figura *fi = NULL;
    
    	switch (scelta)
    	{
    		case 1: //Cerchio
    			fi = new cerchio();
    
    			cout << "Inserisci il raggio della circonferenza: ";
    			cin >> ((cerchio *)fi)->raggio;
    
    			break;
    		case 2: //Quadrato
    			fi = new quadrato();
    
    			cout << "Inserisci il lato del quadrato: ";
    			cin >> ((quadrato *)fi)->lato;
    
    			break;
    	}
    	
    	if (fi)
    	{
    		cout << fi->calcolo_perimetro() << endl;
    		cout << fi->calcolo_area() << endl;
    
    		delete fi;
    	}
    }
    
    
  • Re: Problema con classi derivate

    oregon ha scritto:


    Rivedrei il codice così, per iniziare ...
    
    #include <iostream>
    #define pi 3.14
    using namespace std;
    
    class figura
    {
    public:
    	virtual double calcolo_perimetro() = 0; 
    	virtual double calcolo_area() = 0; 
    };
    
    class cerchio : public figura //Area e perimetro cerchio
    {
    public:
    	double raggio;
    	virtual double calcolo_perimetro();
    	virtual double calcolo_area();
    };
    
    class quadrato : public figura
    {
    public:
    	double lato;
    	virtual double calcolo_perimetro();
    	virtual double calcolo_area();
    };
    
    double cerchio::calcolo_area()
    {
    	return (raggio * raggio * pi);
    }
    
    double cerchio::calcolo_perimetro()
    {
    	return (2 * pi * raggio);
    }
    
    double quadrato::calcolo_area()
    {
    	return (lato * 4.0);
    }
    
    double quadrato::calcolo_perimetro()
    {
    	return (lato * lato);
    }
    
    int main()
    {
    	int scelta;
    	cout << "Quale figura ti serve? Inserisci un numero" << endl;
    	cin >> scelta;
    
    	figura *fi = NULL;
    
    	switch (scelta)
    	{
    		case 1: //Cerchio
    			fi = new cerchio();
    
    			cout << "Inserisci il raggio della circonferenza: ";
    			cin >> ((cerchio *)fi)->raggio;
    
    			break;
    		case 2: //Quadrato
    			fi = new quadrato();
    
    			cout << "Inserisci il lato del quadrato: ";
    			cin >> ((quadrato *)fi)->lato;
    
    			break;
    	}
    	
    	if (fi)
    	{
    		cout << fi->calcolo_perimetro() << endl;
    		cout << fi->calcolo_area() << endl;
    
    		delete fi;
    	}
    }
    
    
    Ti ringrazio della correzione, però non capisco il perché spunta quell'errore, visto che ora facendo un'altro programma mi spunta sempre quell'errore li
  • Re: Problema con classi derivate

    Manca l'implementazione del metodo virtuale, per quello che ti ho mostrato potevi scrivere

    virtual double calcolo_perimetro() { return 0.0; };

    oppure dichiari il metodo virtuale puro con

    virtual double calcolo_perimetro() = 0;
  • Re: Problema con classi derivate

    oregon ha scritto:


    Manca l'implementazione del metodo virtuale, per quello che ti ho mostrato potevi scrivere

    virtual double calcolo_perimetro() { return 0.0; };

    oppure dichiari il metodo virtuale puro con

    virtual double calcolo_perimetro() = 0;
    Ah ecco, ti ringrazio
Devi accedere o registrarti per scrivere nel forum
4 risposte