Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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.






The old lie: Dulce et decorum est pro patria mori
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


The old lie: Dulce et decorum est pro patria mori
PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1057
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


ti piacciono gli indovinelli e gli enigmi? visita http://www.moscio88.altervista.org/gioco
e vedi quanto impieghi ad arrivare al sessantesimo livello!
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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....


Ingegnere Informatico
https://ldlagency.it
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


Hey, sono anche su Twitter! www.twitter.com/simonecassin
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


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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!


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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?


The old lie: Dulce et decorum est pro patria mori
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo