Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Primi passi con le classi

    Scusate la rima

    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

    codice:
     
    #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

    codice:
     
    #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

    codice:
     #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.
    "Science is a differential equation.
    Religion is a boundary condition."
    (Alan Touring)

  2. #2
    Inizia con il togliere le chiamate a costruttore e distruttore.
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #3
    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
    "Science is a differential equation.
    Religion is a boundary condition."
    (Alan Touring)

  4. #4
    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
    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/...e-distruttori/
    ma in qualsiasi altro tutorial/libro/guida troverai tantissime altre informazioni.


    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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...
    every day above ground is a good one

  6. #6
    Grazie ad entrambi per le risposte, come sempre su questo forum in pochissimo tempo riesco a risolvere i miei dubbi.
    "Science is a differential equation.
    Religion is a boundary condition."
    (Alan Touring)

  7. #7
    Originariamente inviato da adrycast
    Grazie ad entrambi per le risposte, come sempre su questo forum in pochissimo tempo riesco a risolvere i miei dubbi.
    Questo mi fa molto piacere..


    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.