Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77

    [C++] Errore corrispondenza classe base e classe derivata

    Buonasera, ho un problema con questo programma che � composto da:
    1. Una classe base Manoscritto;
    2. Una classe derivata Lettera;
    3. Un contenitore realizzato come vettore allocato staticamente.
    Il mio problema nasce in quest'ultimo e in particolare nella funzione chiamata "inserimento", quando cerco di inserire dal main un qualsiasi oggetto Lettera mi da il seguente errore:
    [Error] no matching function for call to 'miospazio::Vettore::inserimento(miospazio::Letter a&)'
    inoltre mi da due note, cliccando sulla prima mi rimanda alla funzione inserimento presente del file.h del vettore, mentre la seconda mi dice:
    [Note] no known conversion for argument 1 from 'miospazio::Lettera' to 'miospazio::Manoscritto* const&'
    Io per ora posto solo il main e i file relativi al contenitore, perch� le classi Manoscritto e Lettera le ho testate con esiti positivi (infatti noterete dei test fra /* */ all'interno del main). Se per� pensate siano necessari pure le altre due classi le posto senza problemi, l'importante � che capisco dove � che sbaglio.
    codice:
    MAIN 
    #include <iostream>
    #include "Vettore.h"
    #include "Lettera.h"
    
    
    using namespace std;
    using namespace miospazio;
    
    
    
    
    int main ()
    {
    	/*
    	Lettera l;
    	Lettera l1 (1,"io",3,"DOC","io","tu");
    	Lettera l2=l1;
    	
    	//cin >> l;
    	cout << l;
    	
    	cout << l1;
    	cout << "\n________________________________\n";
    	cout << l2;
    	cout << "\n_________Lettura da file_________\n";
    	
    	Lettera l3;
    	ifstream filein;
    	filein.open("input.txt");
    	l3.visualizza_dati(filein);
    	cout << l3;
    	
    	cout << "\n________Stampa su file___________\n";
    	ofstream fileout;
    	fileout.open("output.txt");
    	l1.memorizza_dati(fileout);
    	*/
    	Vettore v;
    	Lettera l1 (1,"io",11,"Libro","io","tu");
    	Lettera l2 (2,"tu",22,"Libro","tu","egli");
    	Lettera l3 (3,"egli",33,"Libro","egli","noi");
    	Lettera l4 (4,"noi",44,"Libro","noi","voi");
    	Lettera l5 (5,"voi",55,"Libro","voi","loro");
    	
    	v.inserimento(l1);
    }
    
    Vettore.h
    #ifndef VETTORE_H
    #define VETTORE_H
    
    
    #include "Lettera.h"
    
    
    using namespace std;
    
    
    namespace miospazio
    {
    	typedef Manoscritto* T;
    	
    	class Vettore
    	{
    		private:
    			static const int MAX = 10;
    			T vet[MAX];
    			int riempimento;
    			
    		public:
    			Vettore () {riempimento = 0;}
    			Vettore (const int dim) {riempimento = dim;}
    		
    			bool empty () const {return riempimento==0;}
    			bool full  () const {return riempimento==MAX;}
    			
    			void bubblesort ();
    			bool ricerca (const T&);
    			bool push (const T&);
    			void inserimento (const T&);		
    			void eliminazione (const int);
    	};
    }
    #endif
    
    Vettore.cpp
    #include "Vettore.h"
    
    
    namespace miospazio
    {
    	void Vettore::bubblesort ()
    	{
    		
    		for (int i=1; i<riempimento; i++)
    		{
    			for (int j=0; j<riempimento-i; j++)
    			{
    				if (vet[j]->get_codice() > vet[j+1]->get_codice())
    				{
    					T temp;
    					temp = vet[j];
    					vet[j] = vet[j+1];
    					vet[j+1] = temp;
    				}
    			}
    		}
    	}
    	
    	bool Vettore::ricerca (const T& a) 
    	{
    		bool trovato = false;
    		int i = 0;
    		while (i<riempimento && trovato == false)
    		{
    			if (a->get_codice()==vet[i]->get_codice())
    			{
    				trovato = true;
    			}
    			else i++;
    		}
    		return trovato;	
    	}
    	
    	bool Vettore::push (const T& a)
    	{
    		if (full()) return false;
    		else 
    		{
    			vet[riempimento] = a;
    			riempimento++;
    			return true;
    		}
    	}
    	
    	void Vettore::inserimento (const T& a)
    	{
    		if (ricerca(a)==false)
    		{
    			push (a);
    			bubblesort();	
    		}
    		else cout << "Errore codice gi� presente nell'elenco";
    		
    	}
    
    
    	void Vettore::eliminazione (const int C)
    	{
    		if (C!=riempimento)
    		{
    			vet[C] = vet[riempimento-1];
    			riempimento--;
    		}
    		bubblesort();
    			
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il metodo inserimento si aspetta un puntatore, mentre tu gli passi un oggetto.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    Io pensavo che facendo un vettore di puntatori alla classe base anche se inserivo un oggetto Lettera, grazie all'ereditarietà si richiamava in automatico la classe Manoscritto e quindi quadrava tutto. Vabbè mi sbagliavo, quindi in teoria nella funzione inserimento presente nel main dovrei mettere il simbolo del riferimento "&" tipo così?
    codice:
    v.inserimento(&l1);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.