Buon pomeriggio Aiuto Con Funzioni Friend

di Anonimizzato19465 il
17 risposte
Salve ragazzi mi spieghereste anche con un esempio cosa sono le funzioni friend? So un pò l'argomento ma vorrei magari degli approfondimenti con dei relativi esempi . Grazie millee

17 Risposte

  • Ragazzi qualcuno mi potrebbe fare l'esempio con il calcolo della distanza tra due punti???


    #include<iostream>
    #include<cmath>
    using namespace std;

    class punto
    {
    private :
    double x,y;
    public :
    punto();
    punto(double,double);
    friend punto distanza(punto,punto);
    };

    punto::punto()
    {
    x=0;
    y=0;
    }

    punto::punto(double a,double z)
    {
    x=a;
    y=z;
    }

    punto distanza(punto a,punto b)
    {
    punto C;

    C.x=(a.x-b.x)^2;
    C.y=(a.y-b.y)^2;

    return sqrt(C.x-C.y);
    }

    int main()
    {
    punto A(5,3),B(1,2);

    cout<<"la distanza e' : "<<distanza(A,B);

    return 0;
    }


    ps: scusatemi se l'ho trascritto cosi ma lo spoiler non lo vedo
    ps2:so che ci sono degli errori ma non li capisco....
  • Nel tuo caso la funzione distanza non appartiene alla classe punto, ma vuole accedere ai membri privati degli oggetti punto che gli vengono passati. Quindi, deve essere "amica" della classe di cui vuole vedere la parti "nascoste".
  • Ok l'ho capita la teoria ma non capisco cosa ho sbagliato nell'esercizio
  • La funzione deve restituire un double
  • Ah okok grazie mille , invece c'è un particolare...quando ho elevato al quadrato mi dà l'errore di conversione mentre se faccio un semplice
    ((a.x-b.x)*(a.x-b.x)) non mi dà l'errore questo perchè? devo richiuderlo tra parentesi??
  • Perché l'operatore ^ non esiste in c++ standard (esiste nel "c++ di microsoft" ma un tutt'altro significato), se vuoi elevare alla potenza devi utilizzare la funzione pow(x, y), dove x è la base e y è l'esponente, includendo la libreria cmath.

    ricordati che le funzioni friend sono da usare quando l'istanza chiamante non è un oggetto di classe. probabilmente il tuo era un esercizio a scopo didattico e quindi non preoccuparti, ma l'istanza chiamante per il calcolo di una distanza fra due punti è proprio uno di essi, quindi sarebbe sbagliato metterla come metodo friend.
  • oregon ha scritto:


    Quale? non è l'operatore che permette la creazione di oggetti gestiti dal "garbage collector"?
  • Sisi nel c++ di microsoft funziona in quel modo in dev non ricordavo quale fosse! si bhe a scopo didattico grazie mille!
  • State facendo confusione tra c++.net e c++ nativo.

    Nel normale c/c++ anche di microsoft il ^ è l'operatore or esclusivo bit a bit (come per tutti i compilatori)
  • oregon ha scritto:


    State facendo confusione tra c++.net e c++ nativo.

    Nel normale c/c++ anche di microsoft il ^ è l'operatore or esclusivo bit a bit (come per tutti i compilatori)
    perdindirindina, me ne ero scordato.
    mi ricordavo soltanto quel fatto del c++.net poiché l'avevamo visto in classe.
  • Ho portato l'esercizio alla prof con una seconda versione solamente che di tutto l'esercizio ho fatto una piccola cosa che non voleva che fosse stata eseguita in quel modo... ovvero nella funzione punto medio voleva che si facesse tornare l'oggetto nuovo nel programma principale e che quindi fosse poi eseguito con dei richiami....

    //Nello Sviluppo
    punto punto_medio(punto a,punto b)
    {
    punto C;

    C.x=(a.x+b.x)/2;
    C.y=(a.y+b.y)/2;

    return C;
    }

    //Nel programma principale ad esempio
    int main
    { punto A(4,5),B(5,7),C;

    cout<<"la coordinata del punto medio è rispettivamente ("<<C.get_x()<<","<<C.get_y()<<")"<<endl;
    return 0;
    }

    il problema e che durante la visualizzazione mi dice che le funzioni richiamate dall'oggetto C non possono essere usate...la prof con il casino che c'è stato ha detto che riguarderà il problema nel weekend per poi darmi la risposta il lunedi....cosa potrebbe esserci di sbagliato??
  • Non è che si capisce molto da quello che scrivi ma forse vuoi ottenere il punto così nel main

    punto M = punto_medio(A, B);

    e quindi utilizzare M.get_x() e M.get_y() per ottenere le coordinate ?
Devi accedere o registrarti per scrivere nel forum
17 risposte