Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: C++ e OOP

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965

    C++ e OOP

    Ho iniziato a leggermi il libro di Stroustrup sul C++ e devo dire che è abbastanza complesso.
    Ho provato ora a formulare un programma per vedere cio' che avevo imparato. Ho provato ad utilizzare le liste.
    Solamente che ho davvero molti molti dubbi.
    Prima di tutto, pero', vi mostro cio' che ho scritto:

    codice:
    #include <iostream>
    #include <list>
    #include <string>
    
    using namespace std;
    
    class player{
    public:
    
    	list<string,string> p;
        string nome_ ;
        string ruolo_;
    
    	void add(nome_& n, ruolo_& r){
    		p.push_back(n,r);
    	}
    
    	void find(nome_& n, ruolo_& r){
    		typedef list<string,string>::const_iterator LI;
    		LI i = p.begin();
    		while(i<p.end()){
    			++i;
    			nome& nm = *i;
    			ruolo& rl = *1:
    			if(nm==n || rl==r || (rl==r && nm==n)){
    				cout<<"Nome: " << n << "\tRuolo: " << r << "\n";
    			}
    		}
    	}
    };
    Diciamo che non si puo' definire un vero e proprio fiasco, siccome solamente ( ) 2 errori sono usciti ( che personalmente non capisco ):

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'nome_'
    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'nome_'


    Premetto anche che se do' a nome_ e a ruolo_ un risultato, vengono fuori 6 errori.

    Comunque adesso esplico i miei dubbi:

    1) Ho salvato quel file in giocatori.cpp . E' corretto???
    2) Dovrei creare un file tipo giocatori.h con solamente la definizione dei metodi? come..
    codice:
    class player{
    public:
    	list<string,string> p;
            string nome_ ;
            string ruolo_;
    	
            void add(nome_& n, ruolo_& r);
    	void find(nome_& n, ruolo_& r);
    };
    3) anche per programmi ad oggetti è necessario un main() ?? questo main() va in un file separato dalla struttura della classe ??

    Probabilmente mi sono scordato qualche domanda, probabilmente ve ne chiedero' qualcuna, a meno che non mi bastino le vostre risposte.

    Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    un errore stava qui

    codice:
    			ruolo& rl = *1; // c'era un :
    solo che persistono gli errori

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'nome_'
    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'nome_'


    mmmh...

  3. #3
    Ti dico subito che per la programmazione oop è sempre necessario un main. Altrimenti queste funzioni non vengono eseguite. Non è necessario che il main() sia in un foglio separato, anche se è buona norma. POtresti suddividere il programma in un header che contenga solo la definizione della classe e dei suoi metodi, ma solo per correttezza formale: funziona tutto comunque. Il file giocatori.cpp va benissimo.
    vuoi giocare al fantacalcio gratis, solo per divertirti con tante altre persone? clicca su http://www.fantamagic.it

  4. #4
    Ma il codice era sul libro? MI sembra che ci siano parecchi errori (magari sbaglio). Per esempio l'erroe che ti dà accade perchè con

    nome_& n, ruolo_& r

    vai a definire due puntatori di tipo nome_ e ruolo_ quando non sono dei tipi di dati, ma solo delle stringhe, dato che hai scritto string nome_ e string ruolo_ .
    Poi non hai definito n e r: sono dei puntatori? Allora aggiungi nella classe
    string *n, *p;

    Magari puoi iniziare correggendo così. (magari ho sbagliato l'interpretazione del tuo programma).
    vuoi giocare al fantacalcio gratis, solo per divertirti con tante altre persone? clicca su http://www.fantamagic.it

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Grazie dei consigli!

    Il codice non era nel libro, ho usato i (tanti) listati per prendere spunti.

    cmq così

    codice:
    	void add(string* n,r){
    		p.push_back(n,r);
    	}
    
    	void find(string* n,r){
            ....
    mi restituisce gli errori

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'r'
    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'r'

  6. #6
    Non
    void add(string* n,r)
    ma
    void add(string *n, string *r) oppure void add(string* n, string* r)

    E così di seguito.
    La
    p.push_back(n,r);
    mi sembra che accetti solo una variabile come input, non due, quindi devi decidere quale passargli.
    Ciao
    vuoi giocare al fantacalcio gratis, solo per divertirti con tante altre persone? clicca su http://www.fantamagic.it

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    avevo provato con

    add(string* n, string* r)

    ma poi saltavano fuori tantissimi errori..(come nel codice seguente)

    come mai qua mi restituisce 19 errori ???

    codice:
    #include <iostream>
    #include <list>
    #include <string>
    
    using namespace std;
    
    class player{
    public:
    
    	list<string> p;
    
    	void add(string* n){
    		p.push_back(n);
    	}
    
    	int find(string* n){
    		typedef list<string>::const_iterator LI;
    		LI i = p.begin();
    		while(i<p.end()){
    			++i;
    			nome& nm = *i;
    			if(nm==n){
    				cout<<n<<" presente nella lista\n";
    				return 1;
    			}
    		}
    		return 0;
    	}
    
    	int main(){
    		player pl;
                    string name;
                    cout << "Nome da aggiungere: ";
                    cin >> name;
    		pl.add(name);
    		int thereis = pl.find(name);
    		if(thereis==1){
    			cout<< "Occorrenza aggiunta correttamente";
    		}
    		else{
    			cout<< "Occorrenza non aggiunta";
    		}
    		return 0;
    	}
    };

  8. #8
    Allora, non è che adesso ci siano più errori, è solo che il compilatore ora te li mostra tutti, mentre prima non andava avanti nel controllo, a causa di due erroi gravi.
    Il punto è questo: non credo che il codice sia corretto. Togliamo
    int
    da
    main , che tanto nons erve e lasciamo solo
    void main() {
    Ora è tardi, domani ridò un'occhiata a tutto il codice. Però la funzione push non va in questo modo.
    Ciao
    vuoi giocare al fantacalcio gratis, solo per divertirti con tante altre persone? clicca su http://www.fantamagic.it

  9. #9
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    se posso... ho dato un'occhiata veloce al codice e mi sono reso conto che main e' un membro della classe... la cosa decisamente non funziona (non so che compilatore usi ma il linker dovrebbe tirarti fuori un errore del tipo "undefined reference to 'main'"... quantomeno ld ritorna questo errore)... quindi devi tirare fuori main dalla classe
    codice:
    #include <...>
    
    class player
    {
      public:
        // i membri pubblici
        // ...
    
      private:
        // i membri privati
        // ...
    };
    
    int main()
    {
      // il codice che usa la classe player
      // ...
    }
    altri errori cosi' su due piedi non ne ho visti... potrebbe essere che ce ne siano altri... ma se correggi quello del main dovresti iniziare a venire a capo della situazione.

    aggiungo un altra cosa... main lascialo int... se ci metti void verosimilmente qualunque compilatore che non sia visualc++ (almeno di quelli che mi e' capitato di usare... che poi sono tutti derivati di gcc...) ti fa una leva e non gli passa nemmeno per l'anticamera del cervello di compilare... mi pare che sul libro di strostrup ci sia un intero paragrafo riguardo alla faccenda

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    OK ho fatto così ma questo

    codice:
    #include <iostream>
    #include <list>
    #include <string>
    
    using namespace std;
    
    class player{
    public:
    
    	list<string> p;
        string nome_ ;
        string ruolo_;
    
    	void add(string* n){
    		p.push_back(n);
    	}
    
    	int find(string* n){
    		int i = p.begin();
    		while(i<p.end()){
    			++i;
    			nome& nm = *i;
    			if(nm==n){
    				cout<<n<<" presente nella lista\n";
    				return 1;
    			}
    		}
    		return 0;
    	}
    };
    
    
    	int main(){
    		player pl;
    		pl.add("Topo Gigio");
    		int thereis = pl.find("Topo Gigio");
    		if(thereis==1){
    			cout<< "Occorrenza trovata";
    		}
    		else{
    			cout<< "Occorrenza non trovata";
    		}
    		return 0;
    	}
    mi dà questi 10 errori


    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 5) : error C2664: 'push_back' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' to 'const class std::basic
    _string<char,struct std::char_traits<char>,class std::allocator<char> > &'
    Reason: cannot convert from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' to 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
    No constructor could take the source type, or constructor overload resolution was ambiguous

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 9) : error C2440: 'initializing' : cannot convert from 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<c
    lass std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator' to 'int'
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : could not deduce template argument for 'const class std::basic_string<_E,_Tr
    ,_A> &' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const _E *,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'const *' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'cons
    t class std::basic_string<_E,_Tr,_A> &' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const class std::list<_Ty,_A> &,const class std::list<_Ty,_A> &)' : could not deduce template argument for 'const class std::list<_Ty,
    _A> &' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce t
    emplate argument for 'const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std:perator <(const struct std:air<_T1,_T2> &,const struct std:air<_T1,_T2> &)' : could not deduce template argument for 'const struct std:air
    <_T1,_T2> &' from 'int'

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2677: binary '<' : no global operator defined which takes type 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,cl
    ass std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator' (or there is no acceptable conversion)

    D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : fatal error C1903: unable to recover from previous error(s); stopping compilation


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 © 2024 vBulletin Solutions, Inc. All rights reserved.