Implementazione di una classe

di il
7 risposte

Implementazione di una classe

Salve a tutti, questo è il mio primo post su questo forum. La mia esperienza in c++ risale a non più di un mese quindi perdonatemi se cado in sfondoni da primato. Il programma IDE che uso è geany su ubuntu 11.10.
Sto cercando di capire come funzionano le classi e sto affrontando un esercizio che mi richiede di implementare una classe di nome impiegato che memorizza un oggetto Persona, definito in un'altra classe. Posto di seguito le due classi.
La classe Persona che permette l'implementazione dell'oggetto Persona:
#ifndef CLASSEPERSONA_H
#define CLASSEPERSONA_H

#include <iostream>
#include <string>

using namespace std;

class Persona
{
	public:
	
		Persona();
		Persona(string nome_p, int eta_p);
		
		void set_nome() const;
		void set_eta() const;
			
	private:
	
		string nome;
		int eta;	
};


#endif
La classe impiegato che permette l'implementazione dell'oggetto impiegato:
#ifndef CLASSEIMPIEGATO_H
#define CLASSEIMPIEGATO_H


#include <iostream>
#include <string>
#include "ClassePersona.h"

using namespace std;

class Impiegato
{
	public:
	
		Impiegato();
		Impiegato(string nome_imp, double stipendioIniziale);
		
		void imposta_stipendio(double nuovoStipendio);
		
		double assegna_stipendio() const;
		string assegna_nome() const;
			
	private:
	
		Persona dati;
		double stipendio;	
};

#endif
Entrambe le classi sono copiate dal libro di riferimento che sto usando (Fondamenti di c++, autore Cay Horstmann), ad eccezione per le funzioni membro implementate da me. L'unico modo che mi è venuto in mente per far sì che la classe impiegato memorizzi un oggetto di tipo Persona è quella di fare un file .cpp in cui definire le funzioni membro (probabilmente non ha alcun senso sta cosa ma come vi ripeto non ho alcuna padronanza dell'argomento).
Vi riporto il file con estensione .cpp che racchiude la definizione delle funzioni membro e dovrebbe accogliere anche un eventuale main per il funzionamento del programma (lo vedrete commentato perchè non ci sono specifiche su quello che deve fare il programma essendo uno dei primi esercizi).
#include <iostream>
#include <string>
#include "ClassePersona.h"
#include "ClasseImpiegato.h"

using namespace std;

Persona::Persona()
{
	eta = 0;
}

Persona::Persona(string nome_p, int eta_p)
{
	nome = nome_p;
	eta = eta_p;
}

void Persona::set_nome()
{
	cout << "Dammi il nome della persona:\n";
	getline(cin,nome);
}

void Persona::set_eta()
{
	cout << "Dammi la sua eta:\n";
	cin >> eta;
}

Impiegato::Impiegato(string nome_imp, double stipendioIniziale)
{
	dati = Persona(nome_imp, 0);
	stipendio = stipendioIniziale;
}

void Impiegato::imposta_stipendio(double nuovoStipendio)
{
	stipendio = nuovoStipendio;
}

double Impiegato::assegna_stipendio() const
{
	return stipendio;
}

string Impiegato::assegna_nome() const
{
	return dati.set_nome();
}

/*int main ()
{
	
}*/
Provando a fare una compilazione delle classi, mi si inchioda in molti punti. Partendo dall'ultimo messaggio d'errore visualizzato, dice: MainImpiegato.cpp:50:1: warning: control reaches end of non-void function [-Wreturn-type]. Questo messaggio fa riferimento all'ultima definizione della funzione di accesso della classe Impiegato chiamata assegna_nome, in pratica questo pezzo di codice qui:
string Impiegato::assegna_nome() const
{
	return dati.set_nome();
}
Da quello che ho capito io, il compilatore si aspetta che quella definizione restituisca qualcosa che sia string e questo non avviene. Proprio non so come fare per dirgli che mi deve restituire solo la variabile nome dell'oggetto dati presente nella sezione private della classe impiegato (che fa riferimento a sua volta alla classe persona).
Forse non si è capito niente di quello che ho scritto e mi scuso in anticipo. Se vi servono ulteriori spiegazioni chiedete senza problemi.
Vi ringrazio tutti per l'aiuto.

7 Risposte

  • Re: Implementazione di una classe

    Prova a fare questi cambiamenti
    cambia la definizione della funzione set_nome() in persona così
    string Persona::set_nome();
    e lo sviluppo così
    
    string Persona::set_nome()
    {
       cout << "Dammi il nome della persona:\n";
       getline(cin,nome);
       return nome;
    }
    
  • Re: Implementazione di una classe

    Ok, ho cambiato i valori in restituzione delle funzioni (come suggerito) ed è cambiato l'errore. Ora le classi sono queste:

    La classe Persona
    #ifndef CLASSEPERSONA_H
    #define CLASSEPERSONA_H
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Persona
    {
    	public:
    	
    		Persona();
    		Persona(string nome_p, int eta_p);
    		
    		string set_nome() const;
    		int set_eta() const;
    			
    	private:
    	
    		string nome;
    		int eta;	
    };
    
    
    #endif
    La classe impiegato
    #ifndef CLASSEIMPIEGATO_H
    #define CLASSEIMPIEGATO_H
    
    
    #include <iostream>
    #include <string>
    #include "ClassePersona.h"
    
    using namespace std;
    
    class Impiegato
    {
    	public:
    	
    		Impiegato();
    		Impiegato(string nome_imp, double stipendioIniziale);
    		
    		void imposta_stipendio(double nuovoStipendio);
    		
    		double assegna_stipendio() const;
    		string assegna_nome() const;
    			
    	private:
    	
    		Persona dati;
    		double stipendio;	
    };
    
    #endif
    Il file .cpp
    
    #include <iostream>
    #include <string>
    #include "ClassePersona.h"
    #include "ClasseImpiegato.h"
    
    using namespace std;
    
    Persona::Persona()
    {
    	eta = 0;
    }
    
    Persona::Persona(string nome_p, int eta_p)
    {
    	nome = nome_p;
    	eta = eta_p;
    }
    
    string Persona::set_nome() const
    {
    	cout << "Dammi il nome della persona:\n";
    	getline(cin,nome);
    	return nome;
    }
    
    int Persona::set_eta() const
    {
    	cout << "Dammi la sua eta:\n";
    	cin >> eta;
    	return eta;
    }
    
    Impiegato::Impiegato(string nome_imp, double stipendioIniziale)
    {
    	dati = Persona(nome_imp, 0);
    	stipendio = stipendioIniziale;
    }
    
    void Impiegato::imposta_stipendio(double nuovoStipendio)
    {
    	stipendio = nuovoStipendio;
    }
    
    double Impiegato::assegna_stipendio() const
    {
    	return stipendio;
    }
    
    string Impiegato::assegna_nome() const
    {
    	return dati.set_nome();
    }
    
    /*int main ()
    {
    	
    }*/
    L'errore che genera ora è sull'operatore cin: MainImpiegato.cpp:29:9: error: ambiguous overload for ‘operator>>’ in ‘std::cin >> ((const Persona*)this)->Persona::eta’. Si riferisce al file .cpp quando definisco la funzione membro della classe Persona:
    int Persona::set_eta() const
    {
    	cout << "Dammi la sua eta:\n";
    	cin >> eta;
    	return eta;
    }
    Perchè non andava bene con void?
    Ancora grazie.
  • Re: Implementazione di una classe

    Hai definito la funzione set_eta() come const e cioè una funzione che promette di non cambiare i membri della classe ma col cin stai cambiano proprio i membri (la variabile eta). Quindi togli il const.

    Per l'altro problema non andava perche tu li chiedevi di farti tornare una string cosa che poi non facevi perche la funzione tornava void.
  • Re: Implementazione di una classe

    Ora l'errore sembra ridotto ad uno solo. Fa rifrimento alla funzione membro assegna_nome della classe impiegato nel file .cpp e recita: MainImpiegato.cpp:51:23: error: passing ‘const Persona’ as ‘this’ argument of ‘std::string Persona::set_nome()’ discards qualifiers [-fpermissive].
    Sarebbero queste righe di codice:
    string Impiegato::assegna_nome() const
    {
    	return dati.set_nome();
    }
  • Re: Implementazione di una classe

    Trovato, era lo stesso errore di prima. Sempre colpa di const.
    Approfitto per un paio di cose che sul libro non specifica. Quei caratteri che ho scritto in maiuscolo all'inizio delle due classi (CLASSEPERSONA_H e CLASSEIMPIEGATO_H) a che servono?è necessario scriverli in maiuscolo con _H? Devono avere lo stesso nome della classe?
  • Re: Implementazione di una classe

    Si chiamano define guard. Serve per non includere più volte nella fase di linking lo stesso header per non rincorrere a problemi.
    Guarda quà
    http://it.wikipedia.org/wiki/Include_guar

    Non devono avere neccessariamente il nome del file ma un nome univoco.
  • Re: Implementazione di una classe

    Un'altra domanda, per quale motivo dopo che ho scritto una classe l'implementazione delle sue funzioni membro devono andare nel file .cpp e non possono stare nel .h relativo alla classe?
    Inoltre, come faccio a compilare una classe da sola senza scrivere il .cpp? Chiedo questo perchè con geany dopo che ho scritto la classe e la vado a compilare mi da sempre errore nel primo #include che trova, generalmente <iostream>.
Devi accedere o registrarti per scrivere nel forum
7 risposte