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++ - Forse questione di sintassi,,,ma non va
Forum - C/C++ - Forse questione di sintassi,,,ma non va

Avatar
JackDaniels (Normal User)
Newbie


Messaggi: 18
Iscritto: 08/10/2007

Segnala al moderatore
Postato alle 14:28
Giovedì, 25/10/2007
Salve a tutti,
arrivo subito al dunque. questo è il codice:

File classe.h
Codice sorgente - presumibilmente C++

  1. //Dichiarazione e prototipi della classe CLASSE
  2.  
  3. #ifndef CLAX
  4. #define CLAX
  5.  
  6. template <class generic> class Classe {
  7.       generic a;
  8.       generic b;
  9.       public:
  10.              void setClasse(generic x, generic y);
  11.              void getClasse();
  12. };
  13.  
  14. #endif



File classe.cpp
Codice sorgente - presumibilmente C++

  1. //Implementazione dei metodi della classe CLASSE
  2.  
  3. #include "classe.h"
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. template <class generic>
  8. void Classe<generic>::setClasse(generic x, generic y){
  9.      a=x;
  10.      b=y;
  11. }
  12.  
  13. template <class generic>
  14. void Classe<generic>::getClasse(){
  15.      cout <<"a= " <<a;
  16.      cout <<'\n' <<"b= " <<b;
  17.      cout <<"\n\n";
  18. }



File main.cpp

Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "classe.h"
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     Classe<int> oggetto1;
  10.     oggetto1.setClasse(10,20);
  11.     oggetto1.getClasse();
  12.    
  13.     system("PAUSE");
  14.     return EXIT_SUCCESS;
  15. }



Compilando vengono restituiti i messaggi:
  [Linker error] undefined reference to `Classe<int>::setClasse(int, int)'
  [Linker error] undefined reference to `Classe<int>::getClasse()'

So che dipende dal fatto che Classe è template  ma a me serve così che faccio? ho tralasciato qualcosa? purtroppo sui manuali che ho e su internet non trovo nulla
help

Ultima modifica effettuata da JackDaniels il 25/10/2007 alle 14:32


Perchè è bello programmare? Perchè si può far fare a qualcun'altro quello che non vuoi fare tu!!
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 15:56
Giovedì, 25/10/2007
metti tutta la definizione di Classe nel file header:

classe.h
Codice sorgente - presumibilmente C++

  1. //Dichiarazione e prototipi della classe CLASSE
  2.  
  3. #ifndef CLAX
  4. #define CLAX
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. template <typename generic>
  10. class Classe {
  11. private:
  12. generic a;
  13. generic b;
  14. public:
  15. void setClasse(generic x, generic y);
  16. void getClasse();
  17. };
  18.  
  19. template <typename generic>
  20. void Classe<generic>::setClasse(generic x, generic y){
  21. a=x;
  22. b=y;
  23. }
  24.  
  25. template <typename generic>
  26. void Classe<generic>::getClasse(){
  27. cout <<"a= " <<a;
  28. cout <<'\n' <<"b= " <<b;
  29. cout <<"\n\n";
  30. }
  31.  
  32. #endif



ho provato e funziona, inoltre guardando il C++ tecniche avanzate di programmazione deitel&deitel ho notato che tutte le classi template non hanno la separazione dell'implementazione in un altro file cpp.

Ultima modifica effettuata da netarrow il 25/10/2007 alle 15:56



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
JackDaniels (Normal User)
Newbie


Messaggi: 18
Iscritto: 08/10/2007

Segnala al moderatore
Postato alle 10:04
Venerdì, 26/10/2007
Testo quotato

Postato originariamente da netarrow:

metti tutta la definizione di Classe nel file header:

classe.h
Codice sorgente - presumibilmente C++

  1. //Dichiarazione e prototipi della classe CLASSE
  2.  
  3. #ifndef CLAX
  4. #define CLAX
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. template <typename generic>
  10. class Classe {
  11. private:
  12. generic a;
  13. generic b;
  14. public:
  15. void setClasse(generic x, generic y);
  16. void getClasse();
  17. };
  18.  
  19. template <typename generic>
  20. void Classe<generic>::setClasse(generic x, generic y){
  21. a=x;
  22. b=y;
  23. }
  24.  
  25. template <typename generic>
  26. void Classe<generic>::getClasse(){
  27. cout <<"a= " <<a;
  28. cout <<'\n' <<"b= " <<b;
  29. cout <<"\n\n";
  30. }
  31.  
  32. #endif



ho provato e funziona, inoltre guardando il C++ tecniche avanzate di programmazione deitel&deitel ho notato che tutte le classi template non hanno la separazione dell'implementazione in un altro file cpp.



Si net hai ragione. Avevo risolto da me andando a includere nel main non il file classe.h bensì il classe.cpp che poi in soldoni sarebbe la stessa cosa che hai detto tu ma continuando a lasciare il file.h separato dal .cpp. Ma guarda un pò...dovrebbero comunicarlo a lettere cubitali sui manuali quando si sognano di fare queste differenziazioni...biricchini:rotfl:

Grazie cmq:k:


Perchè è bello programmare? Perchè si può far fare a qualcun'altro quello che non vuoi fare tu!!
PM Quote