Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++]Come includere una classe in un file .h ?
Forum - C/C++ - [C++]Come includere una classe in un file .h ?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 10:00
Mercoledì, 30/12/2009
Salve,
dovrei creare un programma abbastanza grande e allora ho deciso di farlo orientato agli oggetti, ma ho un problema: praticamente voglio creare tanti file *.h quante sono le classi. Così le includerei nel main.cpp in modo da avere un main "più leggibile".
Io per adesso ho scritto questo codice:

main.cpp:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include "prova.h"
  3. using namespace std;
  4. int main (){
  5.     prv r;
  6.     cin>>r.x;
  7.     cin>>r.y;
  8.     system("pause");
  9.     return 0;
  10.     }



prova.h:
Codice sorgente - presumibilmente C++

  1. class prv{
  2.       public:
  3.              int x, y;
  4.              int somma(){
  5.                  return x+y;
  6.                  }
  7.       }



ma non va...

Come si fa ad includere una classe in c++?
Grazie.





PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:33
Mercoledì, 30/12/2009
Ai dimenticato il ";" alla fine della dichiarazione della classe.

Ultima modifica effettuata da il 30/12/2009 alle 11:36
PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 11:53
Mercoledì, 30/12/2009
che errore del cavolo XD... Spesso sono i ; che creano i problemi più grandi di un programmatore...:D

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 12:46
Mercoledì, 30/12/2009
Testo quotato

Postato originariamente da Poggi Marco:

Ai dimenticato il ";" alla fine della dichiarazione della classe.




e tu HAI dimenticato qualcos'altro XD

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:08
Mercoledì, 30/12/2009
Testo quotato

Postato originariamente da Anonymous:

Testo quotato

Postato originariamente da Poggi Marco:

Ai dimenticato il ";" alla fine della dichiarazione della classe.




e tu HAI dimenticato qualcos'altro XD



... di molto più importante....

PM Quote
Avatar
cassin.simone (Member)
Guru


Messaggi: 1051
Iscritto: 03/06/2009

Segnala al moderatore
Postato alle 13:12
Mercoledì, 30/12/2009
Testo quotato

Postato originariamente da HeDo:

Testo quotato

Postato originariamente da Anonymous:

Testo quotato

Postato originariamente da Poggi Marco:

Ai dimenticato il ";" alla fine della dichiarazione della classe.




e tu HAI dimenticato qualcos'altro XD



... di molto più importante....



:om: La h!!! xD

Ultima modifica effettuata da cassin.simone il 30/12/2009 alle 13:15
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 17:14
Mercoledì, 30/12/2009
mmm.. solitamente un header .h deve contenere solo prototipi o classi, il corpo delle funzioni o classi và contenuta in un altro file .cpp che solitamente ha lo stesso nome dell'header .h

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 17:40
Mercoledì, 30/12/2009
quoto Lawliet.
La pratica di includere il codice dei metodi nell'header è comunemente usata nelle classi del Java e forse di altri linguaggi simili. In C++ si DEVE separare il prototipo (nell'header .h) dall'implementazione (nel codice .cpp).
Se non vengono separati, si ottiene una duplicazione del codice quanto includi lo stesso header in due diversi file del progetto con conseguente super cazziatone da parte del linker.
Nel tuo caso, cioè un unico file di codice (il famigerato main.cpp) il problema non si nota, ma scrivendo un programma "vero" (con almeno qualche decina di sorgenti) ti troveresti nel costante incubo dell'organizzazione degli headers.

E' buona norma, quindi, fare in questo modo:

prima si creano i prototipi della classe
Codice sorgente - presumibilmente C++

  1. // MiaClasse.h
  2.  
  3. // questo #pragma indica al compilatore di non duplicare questa inclusione, per evitare ridefinizioni fastidiose
  4. #pragma once
  5.  
  6. class MiaClasse
  7. {
  8. public:
  9.   MiaClasse(); // Costruttore
  10.   ~MiaClasse(); // Distruttore
  11.  
  12.   int GetChupaCabra();  // Un metodo getter qualsiasi
  13.   void SetChupaCabra(int value); // Un metodo setter qualsiasi
  14.  
  15. private:
  16.   int m_chupaCabra;  // Una variabile privata
  17. };



poi si crea l'implementazione della classe su un file separato:
Codice sorgente - presumibilmente C++

  1. // MiaClasse.cpp
  2. // Richiamo i prototipi definiti nell'header e li implemento
  3. #include "MiaClasse.h"
  4.  
  5. // Il costruttore...
  6. MiaClasse::MiaClasse()
  7. {
  8.   m_chupaCabra = 0;
  9. }
  10.  
  11. // ... e suo cugino
  12. MiaClasse::~MiaClasse()
  13. {
  14.   // non faccio nulla
  15. }
  16.  
  17. // I metodi get e set per la variabile privata (questo si chiama "incapsulamento" ragazzo!)
  18. void MiaClasse::SetChupaCabra(int value)
  19. {
  20.   m_chupaCabra = value;
  21. }
  22.  
  23. int MiaClasse::GetChupaCabra()
  24. {
  25.   return m_chupaCabra;
  26. }



e infine si utilizza la classe nel file in cui serve, supponiamo il main.cpp
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. // includo la classe
  4. #include "MiaClasse.h"
  5.  
  6. using namespace std;
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.   MiaClasse kane, zotico;
  11.  
  12.   kane.SetChupaCabra(400);
  13.   zotico.SetChupaCabra(300);
  14.  
  15.   cout << "Kane ha " << kane.GetChupaCabra() << " capre morte" << endl;
  16.   cout << "lo zotico ha " << zotico.GetChupaCabra() << " capre morte" << endl;
  17.  
  18.   return 0;
  19. }



In questo caso non uso new e delete in quanto alloco la classe nello stack, quindi il distruttore verrà chiamato subito prima dell'uscita dello scope di visibilità della stessa variabile (in questo caso alla fine del main).

Infine bisogna compilare entrambi i file .cpp, e linkarli insieme. Se usi visual studio no problem. Se usi GCC "liscio" usa la sintassi:

gcc -o cabron.bin MiaClasse.cpp main.cpp

ed esegui usando il comando ./cabron.bin

Buon divertimento!

PS: Ah, dimenticavo. Ho scritto il codice senza provarlo sul compilatore, quindi c'è un'elevata probabilità che abbia fatto qualche errore... testare per credere!

PM Quote
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 18:01
Mercoledì, 30/12/2009
Nooooo il super cazziatone da parte del linker non lo voglio! Seguirò i tuoi consigli..
Cmq è proprio obbligatorio creare il file .h o basta mettere semplicemente l'implementazione dei metodi già nel file .cpp?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo