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

Discussione: [c++] Composizione

  1. #1

    [c++] Composizione

    Come faccio ad usare il metodo della composizione su due classi contemporanemente??? VVoVe:

    Ovvero...ho la classe CAMPO che è formata da giocatori e la classe GIOCATORI che devono conoscere la classe Campo per potersi orientare (posizione palla,pos avversario ect ect)

    il compilatore non riesce a digerirla questa cosa...xchè?

    Campo.h
    codice:
    #ifndef CAMPO_H
    #define CAMPO_H
    
    
    #include "Giocatore.h"
    
    using namespace std;
    
    
    class Campo {
                 public:
                        Campo(int,int,Giocatore&,Giocatore&);
                                                                                   
                 private:
                         Giocatore *s1[5];
                         Giocatore *s2[5];                     
    
                };         
    
    #endif

    Giocatore.h
    codice:
    #ifndef GIOCATORE_H
    #define GIOCATORE_H
    
    #include "Campo.h"
    
    
    using namespace std;
    
    class Giocatore:{
                     public:
                            Giocatore(string,double=0.0,double=0.0);               
                            virtual void gioca(Campo&,int)=0;
    
                     protected:
    
                    };
                    
    #endif
    che devo fare?
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    prova a modificare Campo.h cosi:

    codice:
    #ifndef CAMPO_H
    #define CAMPO_H
    
    //Invece di includere Giocatore.h semplicemente
    //dichiari l'esistenza della classe
    class Giocatore;
    
    using namespace std;
    
    
    class Campo {
                 public:
                        Campo(int,int,Giocatore&,Giocatore&);
                                                                                   
                 private:
                         Giocatore *s1[5];
                         Giocatore *s2[5];                     
    
                };         
    
    #endif

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    tnx per laiuto

    Sembra funzionare però l'errore ora si sposta su questa riga:


    codice:
    Campo::Campo(int a,int b,Giocatore &aa,Giocatore &bb)
     { 
      for (int i=0;i<5;i++) s1[i]=aa[i];
    ...
     }
    il main chiama campo con Campo c(40,20,Squadra1,Squadra2); dove Squadra1 è Giocatore *Squadra1[5];


    l'errore che mi segnala è :

    Error E2094 Campo.cpp 14: 'operator+' not implemented in type 'Giocatore' for arguments of type 'int' in function Campo::Campo(int,int,Giocatore &,Giocatore &)
    tra l'altro mi dà pure questo warning:

    Warning W8057 Campo.cpp 25: Parameter 'aa' is never used in function Campo::Campo(int,int,Giocatore &,Giocatore &)
    xchè? :master:
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non capisco perche nel costruttore di Campo passi Squadra1 che è un array di puntatori a Giocatore, mentre dovresti passare un reference a Giocatore

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Originariamente inviato da anx721
    Non capisco perche nel costruttore di Campo passi Squadra1 che è un array di puntatori a Giocatore, mentre dovresti passare un reference a Giocatore
    xchè la squadra è composta da 5 giocatori (calcetto) e ,nella mia ignoranza, non so come poter passargli 5 giocati con un solo reference a un singolo giocatore

    Per questo gli passo un array di puntatori ,del resto negli attributi di campo c'è un array di giocatori!
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    devi fare:

    Campo::Campo(int a,int b,Giocatore *aa[5], Giocatore *bb[5])
    {
    for (int i=0;i<5;i++) s1[i]=aa[i];
    ...
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  7. #7
    tnx!

    però non capisco dove stava l'errore e mi sa che non ho ben chiara la differenza tra * e &

    *a dichiara un puntatore
    &a mi dà l'indirizzo di a


    giusto?

    :master:
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    L'erore era che te volevi un array mentre passavi un oggetto.

    Inoltre non devi confondere l'operatore & usato per avere l'indirizzo di una variabile e l'operatore & usato per dichiarere un reference.

    Se dichiari

    1 - void f(Classe *a)

    stai dicendo che f prende un puntatore ad un oggetto di tipo Classe ai cui membri puoi accederte con ->, e per invocare f scrivi:

    f(&oggetto);



    Se scrivi

    2 - void f(Class &a)

    f prende un reference all'oggetto 'a', e la funzione va invocata come

    //senza & rispetto aprima
    f(nomeoggetto);


    Un reference puoi considerarlo come un alias, cioè un altro modo di chiamare l'oggetto 'a'. L'argomento 'a' puo essere MODIFICATO permanentemente dalla funzione, ad esempio con un'istruzione del tipo:

    a.nome_campo = 0;

    la variabile argomento viene modificata e la modifica rimane all'uscita della funzione.

    Usando il referrence puoi accedere ai membri dell'oggetto argomento senza usare ->, ma usando il punto. La stessa cosa la puoi fare se dichiari

    3 - void f(Class a)

    in cui non passi il reference, ma proprio l'oggetto; la grande differenza tra la dichiarazione 2) e la dichiarazione 3) sta nel fatto che nella 3) l'argomento viene passato per valore, cioè viene effettuata una copia dell'argomento, e la funzione opera sulla copia, non sulla variabile originale. Se modifichi l'argomento, all'uscita della funzione le modifiche sono perse proprio perche avvengono sulla copia locale della funzione. Per poter modificare direttamente l'argomento in C non avevi altra scelta che passare il puntatore alla variabile, come nella dichiarazione 1); in C++ sono stati intreodotti i reference con cui puoi passare proprio l'oggetto, e non una sua copia, e in piu puoi accedere ai suoi campi con il punto anzicche con la freccia ->.

    Riassumendo:

    1 - Passaggio per Puntatore
    ......dichiarazione: void f(NomeClasse *a);
    ......invocazione: f(&oggetto);
    ......Modifico l'argomento: SI
    ......Accesso ai membri con: ->

    2 - Passaggio per Reference
    ......dichiarazione: void f(NomeClasse &a);
    ......invocazione: f(oggetto);
    ......Modifico l'argomento: SI
    ......Accesso ai membri con: .

    3 - Passaggio per Valore
    ......dichiarazione: void f(NomeClasse a);
    ......invocazione: f(oggetto);
    ......Modifico l'argomento: NO
    ......Accesso ai membri con: .

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  9. #9
    che intendi per modificare l'argomento? :master: i dati della classe?

    io posso usare a.nome_campo = 0; solo e solo se nome_campo è un dato public nella classe a , giusto? :master:
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    esatto, se ad esempio la classe dell'oggetto 'a' ha un campo pubblico nome_campo puoi modificarlo con

    a.nome_campo = 0;

    però se l'oggetto 'a' non è passato per reference, ma per valore, stai modificando una copia dell'oggetto, esempio:

    Codice PHP:
    #include <iostream>

    using namespace std;

    class 
    MiaClasse{

    public:

        
    int nome_campo;

        
    MiaClasse(){
           
    nome_campo 1;
        }
    };

    //Passaggio per valore
    void f1(MiaClasse a){
          
    a.nome_campo 0;
    }

    void f2(MiaClasse &a){
          
    a.nome_campo 0;
    }

    int main(){
        
    MiaClasse a;
        
    cout << "a.nome_campo dopo la creazione: " << a.nome_campo << endl;
        
    f1(a);
        
    cout << "a.nome_campo dopo f1(a): " << a.nome_campo << endl;
        
    f2(a);
        
    cout << "a.nome_campo dopo f2(a): " << a.nome_campo;
        return 
    0;

    l'ouput che ottieni è:

    Codice PHP:
    a.nome_campo dopo la creazione1
    a
    .nome_campo dopo f1(a): 1
    a
    .nome_campo dopo f2(a): 

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.