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.