Pagina 1 di 1
[Risolto][C++] Classi
Inviato: sabato 30 maggio 2015, 12:56
da SteveSicily
Salve sto facendo un programma che gestisce una "Rubrica Polimorfa". Ho definito le classi e ho provato a definire il primo metodo:
Definizione classi
Codice: Seleziona tutto
using namespace std;
class Contatto{
public:
/* Contatto();
Contatto(string n, string cog, string e);
*/
void aggiungi();
void modifica();
void elimina();
void visualizza();
void avanza();
void precedi();
void stampaTutto();
void cancellaTutto();
};
class Privato: public Contatto{
protected:
string nome, cognome, email, cellulare, skype;
};
class Lavoro: public Contatto{
protected:
string nome, cognome, email, fax, p_IVA;
};
Definizione metodo:
Codice: Seleziona tutto
void Contatto::aggiungi(){
string pol;
cout<<"privato o lavoro? ";
cin>>pol;
if(pol == "privato"){
cout<<"aggiungi nome: ";
cin>>Privato.nome;
cout<<"aggiungi cognome: ";
cin>>Privato.cognome;
cout<<"aggiungi email: ";
cin>>Privato.email;
cout<<"aggiungi cellulare: ";
cin>>Privato.cellulare;
cout<<"aggiungi skype: ";
cin>>Privato.skype;
}else if(pol == "lavoro"){
cout<<"aggiungi nome: ";
cin>>Lavoro.nome;
cout<<"aggiungi cognome: ";
cin>>Lavoro.cognome;
cout<<"aggiungi email: ";
cin>>Lavoro.email;
cout<<"aggiungi fax: ";
cin>>Lavoro.fax;
cout<<"aggiungi partita IVA: ";
cin>>Lavoro.p_IVA;
}
}
Alla compilazione mi da questi errori:
Codice: Seleziona tutto
In member function 'void Contatto::aggiungi()':|
error: expected primary-expression before '.' token
Qualcuno mi può aiutare?
Re: [C++] Classi
Inviato: sabato 30 maggio 2015, 14:42
da 1001001
Ciao!
Prima di tutto, sarebbe carino avere un MWE (
http://en.wikipedia.org/wiki/Minimal_Working_Example,
http://stackoverflow.com/help/mcve).
Detto questo,
Privato e
Lavoro (quelli che usi nel metodo
aggiungi) cosa sono?
Se sono variabili, nel codice che hai postato non sono mai state definite.
Se intendevi usare genericamente i tipi
Privato e
Lavoro, non è così che funziona. Devi definire oggetti di tipo
Privato e
Lavoro prima di poter accedere ai loro campi. E btw, i campi li hai dichiarati protected, quindi non ci potrai accedere comunque
Re: [C++] Classi
Inviato: sabato 30 maggio 2015, 14:59
da cortinico
Ciao,
Secondo me, se vuoi utilizzare una rubrica polimorfa devi cambiare una serie di cose.
Intanto i campi ti sconsiglio di accedergli direttamente ma di utilizzare invece dei getter/setter (vedi Information Hiding
https://it.wikipedia.org/wiki/Incapsula ... formatica) )
Poi secondo me ci sono dei membri che puoi portare nella superclasse (vedi nome e congome) che sono condivisi sia dai privati che dai contatti di Lavoro.
Inoltre io cercherei di utilizzare i costruttori e non di fare l'inserimento a mano come lo stai facendo tu.
Ti allego il codice che ho provato a correggere, dimmi se c'e' qualcosa che non ti torna.
Codice: Seleziona tutto
#include <iostream>
#include <string>
using namespace std;
class Contatto{
protected:
std::string nome, cognome;
public:
Contatto(string const& n, string const& c):
nome(n), cognome(c) {
cout << "Oggetto Contatto Creato " << c << " " << n << endl;
}
void aggiungi();
void modifica();
void elimina();
void visualizza();
void avanza();
void precedi();
void stampaTutto(){
cout << " --- Oggetto Contatto --- " << endl;
cout << " - NOME: " << nome << endl;
cout << " - COGNOME: " << cognome << endl;
}
void cancellaTutto();
};
class Privato: public Contatto {
protected:
std::string email, cellulare, skype;
public:
Privato(string nome, string cognome, string email, string cellulare, string skype)
: Contatto(nome, cognome), email(email), cellulare(cellulare), skype(skype) {
cout << "Oggetto Privato Creato " << email << " " << cellulare << " " << skype << endl;
}
};
class Lavoro: public Contatto {
protected:
std::string email, fax, p_IVA;
public:
Lavoro(string nome, string cognome, string email, string fax, string p_IVA)
: Contatto(nome, cognome), email(email), fax(fax), p_IVA(p_IVA) {
cout << "Oggetto Lavoro Creato " << email << " " << fax << " " << p_IVA << endl;
}
};
int main(int argc, char const *argv[])
{
std::string pol;
cout<<"privato o lavoro?";
cin>>pol;
Contatto * c;
string nome, cognome, email, cellulare, skype, fax, piva;
if(pol == "privato"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi cellulare: ";
cin>>cellulare;
cout<<"aggiungi skype: ";
cin>>skype;
Privato p(nome, cognome, email, cellulare, skype);
/* Adesso hai l'oggetto Privato creato, puoi farci ciò che vuoi */
c = &p;
}else if(pol == "lavoro"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi fax: ";
cin>>fax;
cout<<"aggiungi partita IVA: ";
cin>>piva;
Lavoro l(nome, cognome, email, fax, piva);
c = &l;
}
// Grazie all'ereditarietà/polimorfismo qui puoi usare c (istanza di Contatto), senza
// sapere quale sia effettivamente il suo tipo effettivo
c->stampaTutto();
}
Re: [C++] Classi
Inviato: lunedì 1 giugno 2015, 14:52
da SteveSicily
Cioè, tu mi stai dicendo di non usare i metodi come "aggiungi()" ma implementare il codice direttamente nel main e poi passare gli oggetti nella classe?
Scusa una cosa, ma a questo punto, conviene non usare metodi (nessun metodo) ma dichiarare solo oggetti nella classe (nome, cognome ...)?
Re: [C++] Classi
Inviato: lunedì 1 giugno 2015, 15:24
da cortinico
Allora la buona programmazione vorrebbe che quando tu crei un oggetto partendo da una Classe (in questo caso crei un oggetto di tipo Persona) invochi un costruttore. Il costruttore di fatto è un metodo che si occupa di costruire l'oggetto, inserendo tutti quei membri (field, variabili, chiamali come vuoi tu

) che sono necessari all'oggetto per esistere in quanto tale.
Esempio se tu volessi creare un oggetto di tipo Quadrato, dovresti passare al costruttore la lunghezza del lato, che fa parte integrante della natura dell'oggetto. Avrebbe infatti poco senso creare un quadrato senza dirgli quanto è lungo il suo lato...
Lo stesso discorso si applica agli oggetti di tipo Persona. Secondo me devi passagli quantomeno nome e cognome nel costruttore...altrimenti stai creando una persona senza nome/cognome.
I metodi poi li utilizzi per fare tutte le operazioni di comodo legati all'oggetto. Esempio su un quadrato potresti chiedere una cosa tipo getArea() e ti ritorna l'area del quadrato. Su una persona potresti chiamare tipo getNome() per avere il nome, oppure telefona() per chiamare quella persona (magari ti collegi a qualche servizio, etc...)
Quello che dici tu in merito ai metodi aggiungi/rimuovi è un altro discorso. Forse dovresti creare una classe Rubrica, che si occupa di raccogliere tutti i contatti. Allora lì ha senso chiamare un aggiungi(Persona p), in modo che lui possa raccogliere tutte le persone. Dentro utilizzerà una struttura dati a tuo piacimento. Su rubrica potrai implementarti i tuoi metodi cerca() oppure elencoAlfabetico(), etc...vedi tu.
Re: [C++] Classi
Inviato: mercoledì 3 giugno 2015, 15:27
da SteveSicily
cortinico [url=http://forum.ubuntu-it.org/viewtopic.php?p=4764451#p4764451][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
Allora la buona programmazione vorrebbe che quando tu crei un oggetto partendo da una Classe (in questo caso crei un oggetto di tipo Persona) invochi un costruttore. Il costruttore di fatto è un metodo che si occupa di costruire l'oggetto, inserendo tutti quei membri (field, variabili, chiamali come vuoi tu

) che sono necessari all'oggetto per esistere in quanto tale.
Esempio se tu volessi creare un oggetto di tipo Quadrato, dovresti passare al costruttore la lunghezza del lato, che fa parte integrante della natura dell'oggetto. Avrebbe infatti poco senso creare un quadrato senza dirgli quanto è lungo il suo lato...
Lo stesso discorso si applica agli oggetti di tipo Persona. Secondo me devi passagli quantomeno nome e cognome nel costruttore...altrimenti stai creando una persona senza nome/cognome.
I metodi poi li utilizzi per fare tutte le operazioni di comodo legati all'oggetto. Esempio su un quadrato potresti chiedere una cosa tipo getArea() e ti ritorna l'area del quadrato. Su una persona potresti chiamare tipo getNome() per avere il nome, oppure telefona() per chiamare quella persona (magari ti collegi a qualche servizio, etc...)
Quello che dici tu in merito ai metodi aggiungi/rimuovi è un altro discorso. Forse dovresti creare una classe Rubrica, che si occupa di raccogliere tutti i contatti. Allora lì ha senso chiamare un aggiungi(Persona p), in modo che lui possa raccogliere tutte le persone. Dentro utilizzerà una struttura dati a tuo piacimento. Su rubrica potrai implementarti i tuoi metodi cerca() oppure elencoAlfabetico(), etc...vedi tu.
Io leggo e rileggo la tua risposta e non capisco cosa io abbia fatto di diverso
Guarda, ti posto di nuovo il codice e ti posto anche gli errori che mi da:
metodo aggiungi:
Codice: Seleziona tutto
void Contatto::aggiungi(){
string pol;
cout<<"privato o lavoro? ";
cin>>pol;
if(pol == "privato"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi cellulare: ";
cin>>cellulare;
cout<<"aggiungi skype: ";
cin>>skype;
}else if(pol == "lavoro"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi fax: ";
cin>>fax;
cout<<"aggiungi partita IVA: ";
cin>>p_IVA;
}
}
Le classi:
Codice: Seleziona tutto
using namespace std;
class Contatto{
public:
Contatto();
Contatto(string n, string cog, string e){
nome=n;
cognome=cog;
email=e;
}
void aggiungi();
void modifica();
void elimina();
void visualizza();
void avanza();
void precedi();
void stampaTutto();
void cancellaTutto();
protected:
string nome, cognome, email;
};
class Privato: public Contatto{
public:
string cellulare, skype;
public:
Privato(string nome, string cognome, string email, string cellulare, string skype)
:Contatto(nome, cognome, email), cellulare(cellulare), skype(skype){
cellulare=cellulare;
skype=skype;
};
};
class Lavoro: public Contatto{
public:
string fax, p_IVA;
public:
Lavoro(string nome, string cognome, string email, string fax, string p_IVA)
:Contatto(nome, cognome, email), fax(fax), p_IVA(p_IVA){};
};
Main:
Codice: Seleziona tutto
#include <iostream>
#include <vector>
#include "classi.h"
#include "funzioni.h"
#include "metodi.h"
using namespace std;
int main(){
Privato p;
Lavoro l;
Contatto c;
switch(menu()){
case 1:
p.aggiungi();
break;
case 2:
l.aggiungi();
break;
case 3:
c.elimina();
break;
case 4:
c.modifica();
case 5:
c.visualizza();
break;
case 6:
c.avanza();
break;
case 7:
c.precedi();
break;
case 8:
c.stampaTutto();
break;
case 9:
c.cancellaTutto();
break;
default:
return 0;
}
}
PS. per quanto riguarda il main l'ho guardato poco perchè mi sono occupato più sulla definizione delle classi.
Ah ecco gli errori
Codice: Seleziona tutto
metodi.h||In member function 'void Contatto::aggiungi()':|
metodi.h|17|error: 'cellulare' was not declared in this scope|
metodi.h|20|error: 'skype' was not declared in this scope|
metodi.h|32|error: 'fax' was not declared in this scope|
metodi.h|35|error: 'p_IVA' was not declared in this scope|
Rubrica.cpp||In function 'int main()':|
Rubrica.cpp|10|error: no matching function for call to 'Privato::Privato()'|
Rubrica.cpp|10|note: candidates are:|
classi.h|29|note: Privato::Privato(std::string, std::string, std::string, std::string, std::string)|
classi.h|29|note: candidate expects 5 arguments, 0 provided|
classi.h|25|note: Privato::Privato(const Privato&)|
classi.h|25|note: candidate expects 1 argument, 0 provided|
classi.h|25|note: Privato::Privato(Privato&&)|
classi.h|25|note: candidate expects 1 argument, 0 provided|
Rubrica.cpp|11|error: no matching function for call to 'Lavoro::Lavoro()'|
Rubrica.cpp|11|note: candidates are:|
classi.h|40|note: Lavoro::Lavoro(std::string, std::string, std::string, std::string, std::string)|
classi.h|40|note: candidate expects 5 arguments, 0 provided|
classi.h|36|note: Lavoro::Lavoro(const Lavoro&)|
classi.h|36|note: candidate expects 1 argument, 0 provided|
classi.h|36|note: Lavoro::Lavoro(Lavoro&&)|
classi.h|36|note: candidate expects 1 argument, 0 provided|
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 3 second(s)) ===|
Re: [C++] Classi
Inviato: mercoledì 3 giugno 2015, 19:23
da sambu00
Ciao, come dice cortinico è necessario creare/istanziare gli oggetti, altrimenti utilizzi aree nulle.
Quando nel main dichiari "c", "p", ed "l" non crei effettivamente l'oggetto, semplicemente prepari le aree che saranno dedicate a referenziare oggetti di quel tipo.
puoi vedere la creazione/costruzione di un oggetto, di classe "Prvato" referenziato da "p", nel codice postato da cortinico:
Re: [C++] Classi
Inviato: mercoledì 3 giugno 2015, 19:28
da cortinico
Si esatto devi utilizzare i costruttori. Prova a dare un'occhiata a questa pagina per capire meglio:
http://www.html.it/pag/15519/costruttori-e-distruttori/
Re: [C++] Classi
Inviato: giovedì 4 giugno 2015, 13:30
da SteveSicily
Per quanto riguarda l'errore del motodo aggiungi, il quale mi dice "fax, skype ecc. non dichiarati" qui è ancora questione di costruttore nella classe derivata? O il problema è un altro?
Re: [C++] Classi
Inviato: giovedì 4 giugno 2015, 13:40
da cortinico
Quel problema è legato al fatto che non hai dichiarato la variabile 'fax', 'skype', etc... dove andrai a mettere la lettura da standard output.
Devi dichiararle prima. Guarda come ho fatto nel mio main:
Codice: Seleziona tutto
int main(int argc, char const *argv[])
{
std::string pol;
cout<<"privato o lavoro?";
cin>>pol;
Contatto * c;
string nome, cognome, email, cellulare, skype, fax, piva;
if(pol == "privato"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi cellulare: ";
cin>>cellulare;
cout<<"aggiungi skype: ";
cin>>skype;
Privato p(nome, cognome, email, cellulare, skype);
/* Adesso hai l'oggetto Privato creato, puoi farci ciò che vuoi */
c = &p;
}else if(pol == "lavoro"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi fax: ";
cin>>fax;
cout<<"aggiungi partita IVA: ";
cin>>piva;
Lavoro l(nome, cognome, email, fax, piva);
c = &l;
}
// Grazie all'ereditarietà/polimorfismo qui puoi usare c (istanza di Contatto), senza
// sapere quale sia effettivamente il suo tipo effettivo
c->stampaTutto();
}
Re: [C++] Classi
Inviato: venerdì 5 giugno 2015, 12:05
da SteveSicily
Perfetto adesso funziona tutto, ho modificato il metodo "aggiungi()" e il main in questo modo:
aggiungi()
Codice: Seleziona tutto
void Contatto::aggiungi(){
string pol;
string nome, cognome, email, cellulare, skype, fax, p_IVA;
cout<<"privato o lavoro? ";
cin>>pol;
Contatto *c;
if(pol == "privato"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi cellulare: ";
cin>>cellulare;
cout<<"aggiungi skype: ";
cin>>skype;
Privato p(nome, cognome, email, cellulare, skype);
c=&p;
}else if(pol == "lavoro"){
cout<<"aggiungi nome: ";
cin>>nome;
cout<<"aggiungi cognome: ";
cin>>cognome;
cout<<"aggiungi email: ";
cin>>email;
cout<<"aggiungi fax: ";
cin>>fax;
cout<<"aggiungi partita IVA: ";
cin>>p_IVA;
Lavoro l(nome, cognome, email, fax, p_IVA);
c=&l;
}
}
main
Codice: Seleziona tutto
int main(){
Contatto *c;
switch(menu()){
case 1:
c->aggiungi();
break;
case 2:
c->aggiungi();
break;
case 3:
c->elimina();
break;
case 4:
c->modifica();
case 5:
c->visualizza();
break;
case 6:
c->avanza();
break;
case 7:
c->precedi();
break;
case 8:
c->stampaTutto();
break;
case 9:
c->cancellaTutto();
break;
default:
return 0;
}
}
Ora vorrei chiedervi un'altra cosa. Vorrei fare una rubrica vera e propria, cioè con tanti "contatti". In C avrei usato una lista, nel C++ cosa si può fare e (soprattutto) come?
Re: [C++] Classi
Inviato: venerdì 5 giugno 2015, 13:53
da cortinico
Secondo me continua ad essere sbagliato.
Non puoi fare un metodo aggiungi
O meglio lo puoi fare, ma non stai programmando in Object Oriented.
Devi fare un
Costruttore necessariamente.
L'idea è questa.
- Ti fai un oggetto che chiami Rubrica che fa da contenitore degli oggetti (di tipo Contatto)
- Nell'oggetto Rubrica puoi utilizzare il metodo aggiungi (NB: su rubrica...NON su Contatto)
- Ti fai un main con il menù che hai scritto tu
- Quando l'utente seleziona la voce per aggiungere una persona fai i passi seguenti
- Ti crei le stringhe che accoglieranno il nome, cognome, etc...
- Leggi tutti i dati nelle stringhe che hai creato
- Crei un oggetto di tipo Contatto/Lavoro Utilizzando il costruttore
- Invochi il metodo aggiungi sulla rubrica, passandogli come parametro il Contatto appena creato.
Se non ti è chiaro qualche passaggio dimmelo che approfondisco

Re: [C++] Classi
Inviato: venerdì 5 giugno 2015, 17:40
da SteveSicily
Mi sa che non mi è chiaro cosa sia un "oggetto" xD il prof a lezione ha detto che è (in pratica) una variabile. Tu mi stai facendo capire che non è proprio così. Iniziamo da qui xD
Re: [C++] Classi
Inviato: lunedì 8 giugno 2015, 8:33
da sambu00
Una qualsiasi guida sulla programmazione orientata agli oggetti può chiarirti questo dubbio, su internet c'è un sacco di materiale.
Per darti un'idea più definita:
cos'è una CLASSE? è una definizione astratta di quella che è la tua struttura, quindi con i suoi ATTRIBUTI e i suoi METODI.
esempio: la classe VEICOLO è caratterizzata dai seguenti ATTRIBUTI: marca, modello. i suoi METODI sono vai(), ferma(), svolta().
cos'è un OGGETTO? un OGGETTO è un'ISTANZA di una CLASSE. Ovvero la creazione effettiva dell'oggetto, quello che ti abbiamo spiegato durante il post: un OGGETTO viene creato quando viene invocato il METODO COSTRUTTORE della CLASSE, quindi in questo caso
così crei OGGETTO mia_macchina di classe VEICOLO, mia_macchina è effettivamente l'OGGETTO.
Naturalmente puoi creare quanti oggetti vuoi
ora ci sono 2 oggetti distinti: mia_macchina e tua_macchina.
Spero di essere stato chiaro, lascio a te ulteriori approfondimenti, se non ti torna qualcosa chiedi

Re: [C++] Classi
Inviato: martedì 9 giugno 2015, 1:57
da SteveSicily
sambu00 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4766528#p4766528][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Una qualsiasi guida sulla programmazione orientata agli oggetti può chiarirti questo dubbio, su internet c'è un sacco di materiale.
Per darti un'idea più definita:
cos'è una CLASSE? è una definizione astratta di quella che è la tua struttura, quindi con i suoi ATTRIBUTI e i suoi METODI.
esempio: la classe VEICOLO è caratterizzata dai seguenti ATTRIBUTI: marca, modello. i suoi METODI sono vai(), ferma(), svolta().
cos'è un OGGETTO? un OGGETTO è un'ISTANZA di una CLASSE. Ovvero la creazione effettiva dell'oggetto, quello che ti abbiamo spiegato durante il post: un OGGETTO viene creato quando viene invocato il METODO COSTRUTTORE della CLASSE, quindi in questo caso
così crei OGGETTO mia_macchina di classe VEICOLO, mia_macchina è effettivamente l'OGGETTO.
Naturalmente puoi creare quanti oggetti vuoi
ora ci sono 2 oggetti distinti: mia_macchina e tua_macchina.
Spero di essere stato chiaro, lascio a te ulteriori approfondimenti, se non ti torna qualcosa chiedi

Chiarissimo grazie mille!
cortinico [url=http://forum.ubuntu-it.org/viewtopic.php?p=4765761#p4765761][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Secondo me continua ad essere sbagliato.
Non puoi fare un metodo aggiungi
O meglio lo puoi fare, ma non stai programmando in Object Oriented.
Devi fare un
Costruttore necessariamente.
L'idea è questa.
- Ti fai un oggetto che chiami Rubrica che fa da contenitore degli oggetti (di tipo Contatto)
- Nell'oggetto Rubrica puoi utilizzare il metodo aggiungi (NB: su rubrica...NON su Contatto)
- Ti fai un main con il menù che hai scritto tu
- Quando l'utente seleziona la voce per aggiungere una persona fai i passi seguenti
- Ti crei le stringhe che accoglieranno il nome, cognome, etc...
- Leggi tutti i dati nelle stringhe che hai creato
- Crei un oggetto di tipo Contatto/Lavoro Utilizzando il costruttore
- Invochi il metodo aggiungi sulla rubrica, passandogli come parametro il Contatto appena creato.
Se non ti è chiaro qualche passaggio dimmelo che approfondisco

Mi sa che ho ancora tanto da approfondire sul C++

Sapete consigliarmi un qualcosa che sia approfondito e chiaro?

Re: [C++] Classi
Inviato: martedì 9 giugno 2015, 10:43
da cortinico
Secondo me puoi partire da questa guida:
http://www.html.it/guide/guida-c2/
Ti consiglio di leggerla tutta, poi se c'è qualcosa che non ti torna facci sapere e si approfondisce
Re: [C++] Classi
Inviato: martedì 9 giugno 2015, 11:14
da SteveSicily
Ok grazie mille.