Domanda su funzioni di classe

di il
8 risposte

Domanda su funzioni di classe

Salve a tutti, sono nuovo sul forum e sono
nuovo anche per la programmazione ad oggetti.

il mio dubbio è se le funzioni di classe possono restituire valori.
#include<iostream>
#include<cmath>

using namespace std;

class vett{
public:
vett(double, double, double);
void print();
double modulo(vett);
private:
double x,y,z;
};

//costruttore
vett::vett(double a,double b,double c){
x=a;
y=b;
z=c;
}

void vett::print(){
cout << "x= "<< x << "y = " << y << " z = " << z << endl;
}
//modulo vettore
double vett::modulo(vett v){
double mod;

mod = sqrt((v.x)*(v.x) + (v.y)*(v.y) + (v.z)*(v.z));

return mod;
}

//main
int main(){

vett v1(1,4,3);

double m;
m = modulo(v1);
cout << "modulo =" << m << endl;

return 0;}
nel codice che ho postato ho istituito una semplice classe di vettori in 3dimensioni e
ho aggiunto una funzione di classe per il calcolo del modulo.

quando chiamo la funzione modulo però ho errore in compilazione
"modulo was not declared in this scope"

devo aggiungere comunque il prototipo di "modulo" prima del main?

grazie

8 Risposte

  • Re: Domanda su funzioni di classe

    Devi semplicemente specificare l'istanza su cui richiamare il metodo modulo, così
    
    vett v1(1,4,3);
    
    double m;
    m = v1.modulo(v1);
    
    Non c'è bisogno che passi l'oggetto come parametro, questo viene fatto automaticamente con il puntatore this. Ti suggerisco di riscrivere il metodo modulo() rimuovendo il parametro vett v.
  • Re: Domanda su funzioni di classe

    Si in effetti adesso funziona

    ma se avessi una funzione con più oggetti come argomenti?
  • Re: Domanda su funzioni di classe

    Se hai uno o più oggetti li puoi passare alla funzione, funzione che non necessariamente deve far parte della classe.
    La funzione che hai scritto è un metodo di una classe e quindi già in automatico ha accesso ai membri di una certa istanza.
  • Re: Domanda su funzioni di classe

    Ciao, ho aggiunto un altro metodo alla classe, per calcolare l'angolo compreso tra 2
    vettori, quindi devo passare due oggetti alla funzione
    double vett::angolo_compreso(vett v, vett u){
    
    double mod1 = v.modulo(); //modulo vettore1
    double mod2 = u.modulo(); //modulo vettore2
    double prod_scal = (v.x)*(u.x) + (v.y)*(u.y) + (v.z)*(u.z); //prodotto scalare
    double theta = acos( prod_scal / ( mod1 * mod2)); //angolo compreso tra i vettori
    
    return theta; 
    }
    
    che poi chiamo nel main così
    double ang = angolo_compreso(v1,v2);
    ma ottengo lo stesso errore di compilazione "angolo_compreso was not declared in this scope".
    forse per usare le funzioni di classe devo chiamarle in un modo diverso?
  • Re: Domanda su funzioni di classe

    Ti da errore perchè non trova la funzione angolo_compreso().
    Se vuoi utilizzarla così, devi fare in modo che non sia un metodo della classe vett, ma una semplice funzione
    
    double angolo_compreso(vett v, vett u){
    ...
    
  • Re: Domanda su funzioni di classe

    Ok. quindi mi sembra di capire che non c'è un modo
    di usare le funzioni di classe nel modo in cui ho fatto sopra.

    il punto è che le funzioni non di classe però non possono accedere ai membri
    privati, o sbaglio?
  • Re: Domanda su funzioni di classe

    Solitamente per accedere ai membri si scrivono delle funzioni Get/Set per ciascun membro.
    Ci sarebbe anche la possibilità per la tua funzione di renderla "friend" della classe, in modo da permetterle di accedere a tutti i membri.
  • Re: Domanda su funzioni di classe

    Una funzione friend penso sia la soluzione migliore

    grazie per le risposte!
Devi accedere o registrarti per scrivere nel forum
8 risposte