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++ - Costruttore con parametri enum
Forum - C/C++ - Costruttore con parametri enum

Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 17:10
Martedì, 28/08/2012
Ciao a tutti,
sto cercando di costruire un oggetto della classe "forcella", nel cui sorgente ho creato un tipo enum:

forcella.h:
Codice sorgente - presumibilmente C++

  1. #ifndef FORCELLA_H
  2. #define FORCELLA_H
  3.  
  4. #include "sospensione.h"
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. enum scelta1{girder,springer,trailingLink,leadingLink};
  9. class forcella : public sospensione{
  10.         friend istream& operator>> (istream&, scelta1&);
  11. public:
  12.         forcella(scelta1=girder,int=0);
  13.         ~forcella();
  14.         void setTipo();
  15. protected:
  16.         scelta1 tipo;
  17. };
  18.  
  19. #endif



ed ecco il main:

Codice sorgente - presumibilmente C++

  1. #include "componenti/forcella.h"
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main(){
  6.         forcella f(girder,50);
  7.         return 0;
  8. }



Purtroppo il compilatore mi dà: "Symbol 'girder' could not be resolved". Sembra un problema relativo allo scope della enum.. come posso ovviare secondo voi? Ho già provato con qualcosa del tipo forcella::girder, ma non funziona perché la enum non è e non può essere parte della classe forcella :S

Grazie mille in anticipo!

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:52
Martedì, 28/08/2012
http://it.cppreference.com/w/cpp/keyword/enum

Codice sorgente - presumibilmente C++

  1. #ifndef FORCELLA_H
  2.     #define FORCELLA_H
  3.      
  4.     #include "sospensione.h"
  5.     #include <iostream>
  6.     using namespace std;
  7.      
  8.     enum ENU{girder,springer,trailingLink,leadingLink};
  9.  
  10.     class forcella : public sospensione{
  11.             friend istream& operator>> (istream&, ENU&);
  12.     public:
  13.             forcella(ENU e,int=0);
  14.             ~forcella();
  15.             void setTipo();
  16.     protected:
  17.             ENU tipo;
  18.     };
  19.      
  20. #endif




Ultima modifica effettuata da il 29/08/2012 alle 7:59
PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 11:10
Venerdì, 31/08/2012
Hmm continuo ad avere il problema... credevo che non fosse strettamente necessario specificare il nome del parametro nell'interfaccia della classe.
Non è sufficiente scrivere l'implementazione in questo modo?

forcella.cpp
Codice sorgente - presumibilmente C++

  1. #include "forcella.h"
  2. #include "sospensione.h"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. forcella::forcella(scelta1 t,int l) : sospensione(l){
  7.         tipo=t;
  8. }



purtroppo anche se utilizzo l'intero corrispondente al generico elemento della enum mi dà errore.. anche nella pagina che mi hai linkato non riesco a trovare suggerimenti.. come posso fare? :(


PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:15
Venerdì, 31/08/2012
Nell'interfaccia l'identificatore non è necessario.
L'errore è lo stesso di prima?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:35
Venerdì, 31/08/2012
Posto un esempio (vediamo se può servire):

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include"y.h"
  3. using namespace std;
  4.  
  5. int main(){
  6.     Y prova(C);
  7.     return 0;
  8. }



Codice sorgente - presumibilmente C++

  1. #ifndef Y_H_INCLUDED
  2. #define Y_H_INCLUDED
  3.  
  4. #include<iostream>
  5. using namespace std;
  6.  
  7. enum E{A,B,C};
  8.  
  9. class Y{
  10.     public:
  11.         Y(E);
  12.     private:
  13.         E tipo;
  14. };
  15.  
  16. #endif // Y_H_INCLUDED



Codice sorgente - presumibilmente C/C++

  1. #include "y.h"
  2.  
  3. Y::Y(E e){
  4.     cout << e << endl;
  5.     tipo = e;
  6.     cout << tipo << endl;
  7. }


PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 10:49
Sabato, 01/09/2012
Il ragionamento fila a pennello, infatti il tuo programma funziona. Il fatto è che non riesco a capire cosa ho fatto di diverso da te e dove si annida il mio problema.
Cercherò di contestualizzare un attimo il tutto: devo costruire una classe "motocicletta" con tutte le sue componenti. Le singole componenti che ho deciso di considerare (forcella,forcellone,motore,ruota,serbatoio) sono delle classi da cui motocicletta eredita gli attributi, in particolare le classi forcella e forcellone derivano dalla classe sospensione.
Dato che esistono dei tipi specifici di forcella e di forcellone ho deciso di rappresentarli con delle enum, definite rispettivamente nei files forcella.h e forcellone.h (ma non all'interno delle classi, quindi proprio come l'esempio che mi hai fatto vedere).

La situazione è quindi la seguente:
forcella.h
Codice sorgente - presumibilmente C++

  1. #ifndef FORCELLA_H
  2. #define FORCELLA_H
  3.  
  4. #include "sospensione.h"
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. enum scelta1{girder,springer,trailingLink,leadingLink};
  9.  
  10. class forcella : public sospensione{
  11.         friend istream& operator>> (istream&, scelta1&);
  12. public:
  13.         forcella(scelta1 t,int=0);
  14.         ~forcella();
  15.         void setTipo();
  16. protected:
  17.         scelta1 tipo;
  18. };
  19.  
  20. #endif



forcella.cpp
Codice sorgente - presumibilmente C++

  1. #include "forcella.h"
  2. #include "sospensione.h"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. forcella::forcella(scelta1 t,int l) : sospensione(l){
  7.         tipo=t;
  8. }
  9.  
  10. istream& operator>> ( istream& in, scelta1& x ){
  11.         int val;
  12.         if ( in>> val ) {
  13.                 switch ( val ) {
  14.                         case 0: case 1: case 2: case 3:
  15.                                 x = scelta1(val); break;
  16.                         default:
  17.                                 cout<<"Invalid value for type X"<<endl;
  18.                         break;
  19.                 }
  20.         }
  21.         return in;
  22. }
  23.  
  24. void forcella::setTipo(){
  25.         scelta1 t;
  26.         cout<<"Inserisci il numero corrispondente al tipo del forcellone... "<<endl;
  27.         cout<<"0)girder; 1)springer; 2)trailingLink; 3)leadingLink"<<endl;
  28.         cin>>t;
  29.         tipo=t;
  30. }
  31.  
  32. forcella::~forcella(){
  33.         cout<<"Forcella distrutta!"<<endl;
  34. }



motocicletta.h
Codice sorgente - presumibilmente C++

  1. #ifndef MOTOCICLETTA_H
  2. #define MOTOCICLETTA_H
  3.  
  4. #include "componenti/motore.h"
  5. #include "componenti/serbatoio.h"
  6. #include "componenti/forcella.h"
  7. #include "componenti/forcellone.h"
  8. #include "componenti/ruota.h"
  9.  
  10. class motocicletta :
  11.         public motore,public serbatoio,public forcella,public forcellone,
  12.         public ruota{
  13.  
  14.         friend ostream& operator<<(ostream&,motocicletta&);
  15. public:
  16.         motocicletta(char*,char*,scelta1,int,scelta2,int,int,int,bool,int,int);
  17.         ~motocicletta();
  18. private:
  19.         char * marca;
  20.         char * modello;
  21.  
  22. };
  23.  
  24. #endif



motocicletta.cpp
Codice sorgente - presumibilmente C++

  1. #include "motocicletta.h"
  2. #include <string.h>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. motocicletta::motocicletta(char* mar,char* mod,scelta1 tip1,int l1,scelta2 tip2,int l2,int c,int diam,bool gonf,int liv, int max)
  7. : forcella(tip1,l1),forcellone(tip2,l2),motore(c),ruota(diam,gonf),serbatoio(liv,max){
  8.         marca=new char [strlen(mar)+1];
  9.         strcpy(marca,mar);
  10.         modello=new char [strlen(mod)+1];
  11.         strcpy(modello,mod);
  12.         cout<<"Motocicletta creata!!"<<endl;
  13.  
  14. }
  15.  
  16. motocicletta::~motocicletta(){
  17.         cout << "Motocicletta distrutta!"<<endl;
  18. }
  19.  
  20. ostream& operator<<(ostream& fuori,motocicletta& m){
  21.         fuori<<"Marca: "<<m.marca<<" Modello: "<<m.modello<<" Tipo forcella: "<<m.forcella::tipo<<endl;
  22.         fuori<<" Lunghezza forcella: "<<m.forcella::lunghezza<<" Tipo forcellone: "<<m.forcellone::tipo<<endl;
  23.         fuori<<" Lunghezza forcellone: "<<m.forcellone::lunghezza<<" Cilindrata: "<<m.cilindrata<<endl;
  24.         fuori<<" Diametro ruota: "<<m.diametro<<" Massimo carburante: "<<m.massimo<<endl;
  25.         fuori<<" Attuale livello carburante: "<<m.livello<<endl;
  26.         fuori<<" Le sue ruote sono ";
  27.         if(m.gonfia)
  28.                 fuori<<"gonfie";
  29.         else
  30.                 fuori<<"sgonfie";
  31.  
  32.         return fuori;
  33. }



main.cpp
Codice sorgente - presumibilmente C++

  1. #include "motocicletta.h"
  2. #include "componenti/forcella.h"
  3. #include "componenti/forcellone.h"
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. int main(){
  8.         motocicletta moto1("Triumph","Scheggia",girder,50,stampato,60,2000,50,true,100,500);
  9.         cout<<"La mia nuova moto e': "<<endl<<moto1;
  10.         forcella f(girder,50);
  11.         return 0;
  12. }



Quando faccio il build, il tipo forcella ed il tipo motocicletta vengono riconosciuti, ma persiste l'errore "Symbol 'girder' could not be resolved".
La domanda è: per come è scritto il programma, non dovrebbe automaticamente riconoscere il tipo enum "scelta2" e tutte le sue istanze?
Grazie mille per l'aiuto :)

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:52
Sabato, 01/09/2012
Prova a definire l'enumerazione in un header a parte e successivamente includilo dove ti serve.
Dato che riconosce le varie istanze non dovrebbe essere un problema di linker.
Si, i valori delle enumerazioni dovrebbero essere riconosciuti in automatico. (Facendo attenzione ai conflitti)

Ultima modifica effettuata da il 01/09/2012 alle 19:12
PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 16:41
Lunedì, 03/09/2012
Purtroppo ancora niente da fare, grazie mille per l'aiuto :)
a volte penso che sia Eclipse a dare i numeri, perché i conti non tornano.. mah.

Se riuscirò a trovare una soluzione te lo farò sapere :)

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:50
Lunedì, 03/09/2012
Se ritieni che sia problema di IDE(potrebbe essere questione di impostazioni del linker) provane un altro (consiglio codeblocks)

PM Quote