PDA

Visualizza la versione completa : [C++] Primi passi con le classi


adrycast
27-11-2010, 12:03
Scusate la rima :sadico:

Ciao a tutti
la prof ha iniziato a spiegare le classi ma non avendo ancora fatto nessun tipo di esercitazione (ne avendo lei fatto esempi concreti) sto avendo qualche difficoltà nell'esercitarmi.
In particolare quello che sto facendo è un piccolo programmino sulla creazione di un record di tipo prodotto allocato dinamicamente (insomma giusto per iniziare ad imparare almeno la sinstassi base di una classe). Il programma utilizza l'header "prodotto.h" riportato di seguito, implementa le funzioni in "prodotto.cpp" e le richiama nel main (che ovviamente include l'header della classe).
Ecco il codice

prodotto.h



#include <iostream>
#include <cstdlib>
using namespace std;

class Prodotto {


private:
struct Prod;
typedef Prod * prod;
typedef char * stringa;
typedef struct Prod {
stringa Codice;
stringa Descr;
int QTA;
};
prod p;

public:
Prodotto () { p = new Prod;}
void Insert_P ();
void Output_P ();
~Prodotto () {delete p->Codice; delete p->Descr; delete p;}
};


prodotto.cpp



#include "prodotto.h"

void Prodotto::Insert_P () {

char buffer [20];
cout << "\n Codice: " ;
cin.ignore ();
cin.getline (buffer, 21);
p->Codice = new char [(strlen(buffer))+1];
strcpy (p->Codice, buffer);

strcpy (buffer, "");

cout << "\n Descr: " ;
cin.ignore ();
cin.getline (buffer, 21);
p->Descr = new char [(strlen(buffer))+1];
strcpy (p->Descr, buffer);

cout << "\n Quantita': " ;
cin >> p-> QTA;

}


void Prodotto::Output_P () {

cout << "\n Codice: " << p->Codice ;
cout << "\n Descr: " << p->Descr ;
cout << "\n Quantita': " << p->QTA ;
}



main.cpp


#include "prodotto.h"

int main () {

Prodotto PROD();

PROD.Prodotto();
PROD.Insert_P();
PROD.Output_P ();
PROD.~Prodotto();
return 0;
}


Ora non badate troppo allo "stile" perchè l'ho scritta veramente tanto per provare l'implementazione di una classe. Il problema è che per quel che riguarda le chiamate alle funzioni della classe da parte dell'oggetto PROD, mi "accetta" solo il costruttore mentre per tutte le altre mi dice

error: request for member 'Insert_P' in 'PROD', which is of non-class type 'Prodotto()()'

Dove al posto di Insert_P ci sono i nomi delle altre funzioni volta per volta. Ora da quel che capisco mi sembra che PROD non sia di tipo classe, ma non capisco perchè allora mi accetta il costruttore e soprattutto perchè, nell'errore, mi scrive alla fine quel Prodotto con due parentesi vuote...

PS
Non credo cambi niente, comunque l'IDE è Xcode sotto Mac OS.

GliderKite
27-11-2010, 12:42
Inizia con il togliere le chiamate a costruttore e distruttore.

adrycast
27-11-2010, 13:11
E' andato.
Grazie :)

Se posso scocciarti ancora un minuto, mi spiegheresti perchè il richiamare costruttore e distruttore nel main causava quei problemi? Cioè da quei 4 esempi che ha fatto la prof si era capito che il costruttore nel main va chiamato (il distruttore forse non c'era...), ed in generale il non chiamarlo so che induce il main ad utilizzare un costruttore di default che non necessariamente svolge le mansioni del costruttore che creo io :confused:

MdE2005
27-11-2010, 16:25
Originariamente inviato da adrycast
E' andato.
Grazie :)

Se posso scocciarti ancora un minuto, mi spiegheresti perchè il richiamare costruttore e distruttore nel main causava quei problemi? Cioè da quei 4 esempi che ha fatto la prof si era capito che il costruttore nel main va chiamato (il distruttore forse non c'era...), ed in generale il non chiamarlo so che induce il main ad utilizzare un costruttore di default che non necessariamente svolge le mansioni del costruttore che creo io :confused:

Eh no, c'è un errore: viene dichiarato automaticamente un costruttore di default se e solo se non viene dichiarato esplicitamente nella dichiarazione della classe; il costruttore della classe viene invocato non appena si costruisce un'istanza della classe stessa, nel tuo caso Prodotto PROD.

Ecco la spiegazione: http://programmazione.html.it/guide/lezione/1195/costruttori-e-distruttori/
ma in qualsiasi altro tutorial/libro/guida troverai tantissime altre informazioni.


Ciao :)

YuYevon
27-11-2010, 16:41
E un distruttore non va mai richiamato esplicitamente nel programma, per nessun oggetto. Viene richiamato in maniera automatica alla fine del ciclo di vita dell'oggetto stesso, l'importante è averne definito uno nella definizione della classe se ci sono operazioni di pulizia esplicite da eseguire, come deallocazioni dinamiche di memoria, chiusura di file stream ecc...

adrycast
27-11-2010, 21:11
Grazie ad entrambi per le risposte, come sempre su questo forum in pochissimo tempo riesco a risolvere i miei dubbi. :D

MdE2005
28-11-2010, 10:58
Originariamente inviato da adrycast
Grazie ad entrambi per le risposte, come sempre su questo forum in pochissimo tempo riesco a risolvere i miei dubbi. :D

Questo mi fa molto piacere..


Ciao :)

Loading