Programma C++ con puntatori
ciao a tutti, è da un po di tempo che programmo in c++ e dato che il 18 (è un po tardino, lo so!) ho l'esame di "fondamenti di informatica" in cui è prevista prevede una prova di programmazione propedeutica per lo scritto, se qualcuno potesse aiutarmi con questo esercizio gliene sarei veramente grata.
Esercizio
----------
Sia data la seguente definizione della classe Card
class Card {
public:
card ();
card (int i, string p);
int get_id () const;
string get_password();
private:
int id;
string password;
};
Creare un file sorgente (*.cpp) che contenga:
1) un commento con proprio nome, cognome e matricola;
2) le opportune direttive di #include e using;
3) definizione della classe Card;
4) l'implementazione dei costruttori e delle funzioni membro della classe;
5) la definizione di una funzione dichiarata come segue:
bool confronta (const card &c1, const card &c2);
che confronta i dati immessi e restituisce true se i campi il campo id è identico, e false in caso contrario;
DA FARE CON FUNZIONE ESTERNA POICHE' LA CLASSE NON PUO' ESSERE MODIFICATA MA SOLO INTEGRATA CON ALTRE FUNZIONI.
6) una funzione main() in cui si effettua:
- la definizione di puntatore ad oggetto card (facendo uso di un oggetto vector) avente id e password specificati dall'utente a tempo di esecuzione (mediante l'utilizzo di un ciclo for);
- il confronto fra le 4 variabili del vector definito precedentemente al fine di verificare se esiste almeno una coppia di card con id identici (utilizzando la funzione confronta di cui al punto 5);
Sugg. per la seconda parte di (6) usare 2 cicli annidati.
- la stampa a video di un messaggio che visualizzi l'esito del confronto.
-------
i primi punti non mi creano problemi e l'ho così svolto:
-------------------------------
ho scritto nel codice (in un commento) l'errore che mi segnala.
so che la parola "urgente" è taboo in questo forum ma vi sarei grata se poteste aiutarmi al più presto.
grazie mille
ciao
Esercizio
----------
Sia data la seguente definizione della classe Card
class Card {
public:
card ();
card (int i, string p);
int get_id () const;
string get_password();
private:
int id;
string password;
};
Creare un file sorgente (*.cpp) che contenga:
1) un commento con proprio nome, cognome e matricola;
2) le opportune direttive di #include e using;
3) definizione della classe Card;
4) l'implementazione dei costruttori e delle funzioni membro della classe;
5) la definizione di una funzione dichiarata come segue:
bool confronta (const card &c1, const card &c2);
che confronta i dati immessi e restituisce true se i campi il campo id è identico, e false in caso contrario;
DA FARE CON FUNZIONE ESTERNA POICHE' LA CLASSE NON PUO' ESSERE MODIFICATA MA SOLO INTEGRATA CON ALTRE FUNZIONI.
6) una funzione main() in cui si effettua:
- la definizione di puntatore ad oggetto card (facendo uso di un oggetto vector) avente id e password specificati dall'utente a tempo di esecuzione (mediante l'utilizzo di un ciclo for);
- il confronto fra le 4 variabili del vector definito precedentemente al fine di verificare se esiste almeno una coppia di card con id identici (utilizzando la funzione confronta di cui al punto 5);
Sugg. per la seconda parte di (6) usare 2 cicli annidati.
- la stampa a video di un messaggio che visualizzi l'esito del confronto.
-------
i primi punti non mi creano problemi e l'ho così svolto:
//cognome nome matricola #include<iostream> #include<string> #include<vector> using namespace std; class card { public: card (); card (int i, string p); int get_id () const; string get_password(); private: int id; string password; }; card::card() { id=0; } card::card(int i, string p) { id=i; password=p; } int card::get_id () const { return id; } string card::get_password() { return password; } bool confronta(const card &c1, const card &c2) { if ((c1.get_id()==c2.get_id)&&(c1.get_password()==c2.get_password()))return true; else return false; } /* mi segnala un errore alla riga "if ((c1.get_id()==c2.get_id)&&(c1.get_password()==c2.get_password()))return true;" e l'errore che mi da è: Error: invalid use of member (did you forget the '&'?) ho provato a mettere & davanti ai c1 e c2 dato che dice che mancano ma mettendoli mi segnala, sempre nella stessa riga: Error: non-lvalue in unary '& */ int main() { vector<card*> lista_dati; int id_uno; string psw_uno; int id_due; string psw_due; cout<< "inserisci ID"<<'\n'; cin>> id_uno; if (cin.fail()) { cout<<"Errore: Bad input!"; return 1; } cout<< "inserisci psw"<<'\n'; cin>> psw_uno; if (cin.fail()) { cout<<"Errore: Bad input!"; return 1; } card* uno= new card(id_uno, psw_uno); cout<< "inserisci ID"<<'\n'; cin>> id_due; if (cin.fail()) { cout<<"Errore: Bad input!"; return 1; } cout<< "inserisci psw"<<'\n'; cin>> psw_due; if (cin.fail()) { cout<<"Errore: Bad input!"; return 1; } card* due= new card(id_due, psw_due); cout << '\n'<<"ID e psw:"<<'\n' << uno->get_id()<<'\n'; cout << uno->get_password()<<'\n'<<'\n'; cout << "ID e psw:"<<'\n' << due->get_id()<<'\n'; cout << due->get_password()<<'\n'; lista_dati.push_back(uno); lista_dati.push_back(due); return 0; }
-------------------------------
ho scritto nel codice (in un commento) l'errore che mi segnala.
so che la parola "urgente" è taboo in questo forum ma vi sarei grata se poteste aiutarmi al più presto.
grazie mille
ciao
Risposte
ciao,
ho dato una letta velocissima, la riga dove dici c'è un errore, io vedo che manca una parte di chiamata del metodo, cioè:
per il resto aspetta qualcuno con la mente più fresca
ho dato una letta velocissima, la riga dove dici c'è un errore, io vedo che manca una parte di chiamata del metodo, cioè:
if ((c1.get_id()==c2.get_id)&&(c1.get_password()==c2.get_password()))return true;
if ((c1.get_id()==c2.get_id())&&(c1.get_password()==c2.get_password()))return true;
per il resto aspetta qualcuno con la mente più fresca

@ham_burst: grazie mille effettivamente mancava la chiamata...
ho corretto come mi è stato suggerito.
ora mi segnala: passing 'const card' as 'this' argument of 'std::string card::get_password()'
immagino sia un problema di puntatori già che mi dice qualcosa con un 'this' di mezzo...
ho corretto come mi è stato suggerito.
ora mi segnala: passing 'const card' as 'this' argument of 'std::string card::get_password()'
immagino sia un problema di puntatori già che mi dice qualcosa con un 'this' di mezzo...
L'errore è in realtà abbastanza semplice. Siccome ogni funzione membro non statica ha accesso alle variabile membro private della classe e quindi modificare lo stato interno dell'oggetto, non è consentito richiamare una funzione membro non costante (ne discutiamo dopo) utilizzando un istanza costante della classe. È però possibile "marcare" quelle funzioni membro che non modificano lo stato interno della classe in modo da poterle utilizzare in queste circostanze aggiungendo un const dopo le parentesi tonde e prima delle parentesi graffe. Cioè
EDIT: mi sono accorto che per get_id l'avevi già fatto. L'errore è allora semplicemente che ti sei dimenticato di farlo anche in questo caso.
string card::get_password() const { return password; }
EDIT: mi sono accorto che per get_id l'avevi già fatto. L'errore è allora semplicemente che ti sei dimenticato di farlo anche in questo caso.
ok! grazie mille... gentilissimi come sempre...
incrociando le dita per domani spero di non aver più bisogno di aiuto per questa materia...
ormai è un po che ci sono su..
ciao
incrociando le dita per domani spero di non aver più bisogno di aiuto per questa materia...

ormai è un po che ci sono su..
ciao
