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

Hybrid View

  1. #1

    Lavorare con 2 oggetti della stessa classe ma creati in 2 classi diverse

    Ciao, sto facendo un programmino stupido che che lavora con le frazioni, oggetti della classe "Razionale".

    Il primo oggetto "numeroRazionale" l'ho creato nella classe Oggetto_1, mentre il secondo "numRaz" l'ho creato nella classe Oggetto_2; Nella classe Razionale ho creato un metodo "maggiore(Razionale f)" che mi confronta due oggetti frazioni per dirmi quale è maggiore.

    Quindi nel metodo main della classe Oggetto_1 ho richiamato quel metodo per confrontare l'oggetto numeroRazionale con numRaz, nel seguente modo:

    numeroRazionale.maggiore(Oggetto_2.numRaz);

    ma ricevo un errore dal compilatore "cannot be resolved or is not a field". Sapete dirmi perchè?

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Quote Originariamente inviata da sandonatese Visualizza il messaggio
    Ciao, sto facendo un programmino stupido che che lavora con le frazioni, oggetti della classe "Razionale".

    Il primo oggetto "numeroRazionale" l'ho creato nella classe Oggetto_1, mentre il secondo "numRaz" l'ho creato nella classe Oggetto_2; Nella classe Razionale ho creato un metodo "maggiore(Razionale f)" che mi confronta due oggetti frazioni per dirmi quale è maggiore.

    Quindi nel metodo main della classe Oggetto_1 ho richiamato quel metodo per confrontare l'oggetto numeroRazionale con numRaz, nel seguente modo:

    numeroRazionale.maggiore(Oggetto_2.numRaz);

    ma ricevo un errore dal compilatore "cannot be resolved or is not a field". Sapete dirmi perchè?
    non si capisce, posta tuttoil codice

  3. #3
    Classe Razionale:

    codice:
    ....
        boolean maggiore (Razionale f)
        {
            return (num*f.getDen()>f.getNum()*den);
        }
    ....

    Classe Oggetto 2:

    codice:
    ...
    Razionale numRaz2 = new Razionale (7,8);
    ...

    Classe Oggetto 1:
    codice:
    ...
    Razionale numeroRazionale = new Razionale (5,4);
    System.out.println(numeroRazionale.maggiore(Oggetto_2.numRaz2));
    ...
    Ultima modifica di LeleFT; 07-04-2014 a 12:37 Motivo: Aggiunti i tag CODE

  4. #4
    Classe Razionale:

    codice:
    ....
    boolean maggiore (Razionale f)
    {
    return (num*f.getDen()>f.getNum()*den);
    }
    ....

    Classe Oggetto 2:

    codice:
    ...
    Razionale numRaz2 = new Razionale (7,8);
    ...
    

    Classe Oggetto 1:

    codice:
    ...
    Razionale numeroRazionale = new Razionale (5,4);
    System.out.println(numeroRazionale.maggiore(Oggetto_2.numRaz2)); // questa riga mi dà l'errore !!! 
    



    MSG: numRaz2 cannot be resolved or is not a field)
    Ultima modifica di LeleFT; 07-04-2014 a 12:39 Motivo: Aggiunti i tag CODE

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    @sandonatese: il codice va postato all'interno degli appositi tag CODE, altrimenti perde indentazione e formattazione e diventa praticamente illeggibile e incomprensibile.

    Come usare i tag CODE, normalmente:

    [CODE]
    codice
    [/CODE]

    In alternativa, puoi entrare in modalità avanzata (pulsante giallo in basso a destra) ed usare il pulsante "#" che li scrive automaticamente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ok, essendo poche righe di codice pensavo che fosse di facile lettura anche così.
    Non è che per caso sapresti rispondere anche a questa mia domanda?
    Grazie.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    Sì. Il "problema" è che la variabile "numRaz2" non è visibile all'esterno (è senza modificatori, quindi è visibile solo dalle classi dello stesso package). Generalmente io specifico sempre un modificatore (e, in quel caso, adotterei un "private").

    Le soluzioni sono 2:

    1) [pessima, bruttissima, pessimissima]: rendere pubblica quella variabile.
    2) [buona, migliore, ottima]: rendere privata quella variabile e fornire un metodo accessorio (di accesso)... un getter, come si chiama in termine tecnico.


    Questa la seconda soluzione:

    Classe oggetto 2:

    codice:
    private Razionale numRaz2 = new Razionale (7,8);
    ...
    public Razionale getNumRaz2() {
       return numRaz2;
    }

    Quindi, in Oggetto 1:

    codice:
    Razionale numeroRazionale = new Razionale (5,4);
    System.out.println(numeroRazionale.maggiore(Oggetto_2.getNumRaz2()));

    Attenzione che io immagino che Oggetto_2 sia un'istanza della classe Oggetto2 e non il nome della classe.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    No no Oggetto_2 è il nome della classe. Ti posto tutto il codice:

    codice:
    package $6.classi.e.oggetti;
    
    
    public class Oggetto_2 {
    	public static void main(String[] args) {
    		
    		private Razionale numRaz2 = new Razionale (7,8);
    		
    		public Razionale getNumRaz2() {
    			   return numRaz2;
    			}
    	}
    }


    Adottando la tua soluzione continuo ad avere un errore, stavolta direttamente nella Classe Oggetto_2: "
    Multiple markers at this line - Syntax error on token "Razionale", @ expected
    - Syntax error, insert "EnumBody" to complete BlockStatement
    - Syntax error, insert "enum Identifier" to complete "

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    E allora c'è un problema in più.
    Quella variabile non è nemmeno statica. Solo gli oggetti statici possono essere invocati anteponendo il nome della classe, tutti gli altri oggetti sono riferiti a ciascuna istanza della classe, quindi possono essere referenziati solo dalla particolare istanza.

    Per comprendere bene il tuo errore:

    codice:
    public class Numero {
       int num;
       public Numero(int value) { num = value; }
    }

    Creo 3 oggetti della classe Numero:

    codice:
    Numero a = new Numero(1);
    Numero b = new Numero(2);
    Numero c = new Numero(3);

    Cosa dovrebbe restituire Numero.num? Non ha nessun senso... la variabile "num" varrà 1 per l'oggetto "a", varrà 2 per l'oggetto "b" e varrà 3 per l'oggetto "c". Quindi, ha senso chiedere il valore "num" solo alla particolare istanza e non alla classe, che non può sapere quale particolare valore tu vuoi (potrebbe anche non esisterne nessuno, se non hai creato alcuna istanza).

    Gli oggetto "statici", invece, non sono legati alle singole istanze della classe, ma sono legati alla classe (quindi, condivisi da tutte le istanze). In questo caso ha senso richiamare il valore di una variabile "di classe" anteponendo il nome della classe.


    In breve: fai diventare statica la variabile "numRaz2" e studia per bene la differenza fra campi statici (di classe) e campi non statici (di istanza).


    Ciao.
    Ultima modifica di LeleFT; 07-04-2014 a 13:31
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Ciao, ti prego non mi ci mandare e cerca di avere pazienza ... temo che non ci siamo capiti.
    Lo scopo del mio esercizietto era quello di utilizzare un metodo a cui andasse passato come parametro non un tipo primitivo, bensì un tipo classe. In questo caso il metodo "maggiore()" confronta due oggetti della classe Razionale per dirmi qual'è il più grande.

    Nel mio caso numRaz2 non è una variabile di istanza ma un oggetto della classe Razionale, definito all'interno della classe Oggetto_2, mentre numeroRazionale è l'altro oggetto della classe Razionale, dfinito nella classe Oggetto_1. Quindi non posso dichiararlo come statico e non c'è possibilità di confusione per il compilatore perchè numRaz2 è univoco e si riferisce all'istanza 7/8 di Razionale.

    Detto questo, dato che maggiore() è definito nella classe Razionale, come posso confrontare numeroRazionale (5/4) e numRaz2 (7/8)?

    codice:
    package $6.classi.e.oggetti;
    
    
    public class Razionale { 
        
        private int num;
        private int den;
        
        Razionale(int n, int d){
            num = n;
            den = d;
        }
    
    
        void setNum(int n){
            num =n;
        }
        
        void setDen(int d){
            if(d!=0){
                      den = d;
                    }
        }
        
        int getNum(){
            return num;
        }
        
        int getDen(){
            return den;
        }
        
        void stampaFrazione()
        {
            System.out.print(num+"/"+den);
        }
        
        boolean apparente()
        {
            return (num%den==0);
        }
        
        boolean propria()
        {
            return (num<den);
        }
        
        boolean maggiore (Razionale f)
        {
            return (num*f.getDen()>f.getNum()*den);
        }
    }
    Classe Oggetto_2
    codice:
    package $6.classi.e.oggetti;
    
    
    public class Oggetto_2 {
        
        public static void main(String[] args) {
            
             Razionale numRaz2 = new Razionale (7,8);
            
        }
    }
    Classe Oggetto_1
    codice:
    public class Oggetto_1 {
    
    
        public static void main(String[] args) {
    
    
            Razionale numeroRazionale;
            
            numeroRazionale = new Razionale (5,4);
            
            System.out.println(numeroRazionale.getNum());
            
            numeroRazionale.setNum(3);
            
            System.out.println( numeroRazionale.getNum());
            
            System.out.print("la frazione ");
            numeroRazionale.stampaFrazione();
            System.out.println(" è propria: "+numeroRazionale.propria());
            
            System.out.print("la frazione ");
            numeroRazionale.stampaFrazione();
            System.out.println(" è apparente: "+numeroRazionale.apparente());
            
            Razionale numRaz = new Razionale (2,3);
            
            System.out.print("la frazione ");
            numeroRazionale.stampaFrazione();
            System.out.print(" è maggiore di ");
            numRaz.stampaFrazione();
            System.out.print(": ");
            System.out.println(numeroRazionale.maggiore(numRaz2));
            
        }
    
    
    }

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