DOMANDA Codice C++ class friend non funziona

Pubblicità
si, devo sicuramente ripassarmi meglio l' uso delle funzioni. ora sembra che il codice stia migliorando devo solo modificare alcune cose nel main
 
Al termine delle modifiche o se ti blocchi, pubblica nuovamente dove sei arrivato, così vediamo.
ok, ora sembra che debba "sprivatizzare" il P.colore all' interno del main, solo che dentro il main non posso usare di nuovo la parola Friend, pensavo invece di usare una sola riga di codice che mi dava la possibilità di collegarmi direttamente alla funzione già "liberata"
 
Nel main() devi solo creare una una classe Punto, poi chiamare CambiaColore passando tale classe e il valore del colore che vuoi cambiare. Tutto qui. Il concetto è proprio che il parametro ‘colore’ rimanga privato e quindi sia accessibile SOLO all’interno della classe dagli “amici” della stessa.

a me pare che qui il problema non sia che certi libri siano fatti male (in rete ne trovi a milioni) ma piuttosto che tu non abbia ancora capito i minimi concetti della programmazione ad oggetti e la differenza tra un metodo privato e uno pubblico, altrimenti non cercheresti di accedere a ‘colore’ all’interno del main(). Non puoi. È privato.
E ho anche seri dubbi sulla tua conoscenza di programmazione, in quanto dichiari una funzione e poi non la chiami MAI (cambiaColore)

non ti buttare giù, le mie non sono critiche, sto solo cercando di trovare le tue limitazioni ed aiutarti a superarle. Da come scrivi mi pare che i problemi qui siano più seri che solo il concetto di ‘friend’
 
Nel main() devi solo creare una una classe Punto, poi chiamare CambiaColore passando tale classe e il valore del colore che vuoi cambiare. Tutto qui. Il concetto è proprio che il parametro ‘colore’ rimanga privato e quindi sia accessibile SOLO all’interno della classe dagli “amici” della stessa.

a me pare che qui il problema non sia che certi libri siano fatti male (in rete ne trovi a milioni) ma piuttosto che tu non abbia ancora capito i minimi concetti della programmazione ad oggetti e la differenza tra un metodo privato e uno pubblico, altrimenti non cercheresti di accedere a ‘colore’ all’interno del main(). Non puoi. È privato.
E ho anche seri dubbi sulla tua conoscenza di programmazione, in quanto dichiari una funzione e poi non la chiami MAI (cambiaColore)

non ti buttare giù, le mie non sono critiche, sto solo cercando di trovare le tue limitazioni ed aiutarti a superarle. Da come scrivi mi pare che i problemi qui siano più seri che solo il concetto di ‘friend’
Quindi con la parola Friend io posso trasformare un private in public e rendere effettivo il cambiamento solo per le funzioni collegate alle classi ma nel main non si può collegare nessuna riga di codice ad una funzione già liberata?
 
Ti ho praticamente scritto qui e qui come fare.

Ti farei un esempio ma significherebbe scrivertelo completo, in quanto sono 3 righe.

EDIT: ripeto: rileggi attentamente quanto ho scritto in quei due post.
 
Ti ho praticamente scritto qui e qui come fare.

Ti farei un esempio ma significherebbe scrivertelo completo, in quanto sono 3 righe.

EDIT: ripeto: rileggi attentamente quanto ho scritto in quei due post.

il codice che tu intendi, quello che dovrei trovare sotto l' estratto in inglese da te citato, non lo trovo. O meglio, non trovo l' estratto in inglese che hai postato e che fa parte di quella pagina web.

 
Quindi con la parola Friend io posso trasformare un private in public e rendere effettivo il cambiamento solo per le funzioni collegate alle classi ma nel main non si può collegare nessuna riga di codice ad una funzione già liberata?
Non capisco cosa tu voglia dire.
‘Colore’ rimane privato, quindi NON si può accedere dal main()
‘CambiaColore’ invece può accedere a ‘colore’ in quanto viene definita come “amica”
Main() può accedere a CambiaColore (in quanto è una funzione globale come ogni altra).
Quindi:
Codice:
main()
{
  Punto a;
  CambiaColore(a, 10);
  ....
}
Non mi pare così difficile.
 
Quello non è l'URL che ti ho linkato. Io ti ho linkato questo https://en.cppreference.com/w/cpp/language/friend
E te l'ho linkato qui.
Scusa, devo avere fatto confusione, in questi giorni sono dietro a tante cose ?
Non capisco cosa tu voglia dire.
‘Colore’ rimane privato, quindi NON si può accedere dal main()
‘CambiaColore’ invece può accedere a ‘colore’ in quanto viene definita come “amica”
Main() può accedere a CambiaColore (in quanto è una funzione globale come ogni altra).
Quindi:
Codice:
main()
{
  Punto a;
  CambiaColore(a, 10);
  ....
}
Non mi pare così difficile.
Di fatti non è difficile il concetto, più che altro penso che dovrò argomentare e farmi un po di esperienza in più con le funzioni e gli oggetti delle classi.
Ad ogni modo, prima di leggere il tuo post, avevo già inserito il CambiaColore(a, 10) solo che rimane comunque l' errore nel P.StampaDati() mi dice che la P non è dichiarata all' interno del Main. Ora provo a sistemare questa cosa.

Fa****o, l' ho tolto e ora funziona! ??

Ora riesco a far compilare il codice. Grazie a voi per la rinomata pazienza che avete avuto ?
 
Non so esattamente cosa hai fatto. StampaDati è corretto che rimanga nel main. Dovresti fare così:

C++:
#include <iostream>

using namespace std;

class Punto
{
public:
    int x;
    int y;

    Punto(void);
    void StampaDati(void);

private:
    int colore;
    friend void CambiaColore(Punto &,int);
};

Punto::Punto(void)
{
    x=0;
    y=0;
    colore=0;
}

void Punto::StampaDati(void)
{
    cout<<"Ascisse:"<<x<<endl;
    cout<<"Ordinata:"<<y<<endl;
    cout<<"Colore:"<<colore<<endl;
}

 void CambiaColore(Punto &p, int c)
{
    p.colore = c;
}

int main()
{
    cout << "Le funzioni amiche :)" << endl;

    Punto p;
    CambiaColore(p, 3);
    p.StampaDati();
  
    return 0;
}

Per provarlo online http://cpp.sh/75x2c
 
C++:
#include <iostream>

using namespace std;


class Punto
{
public:
    int x;
    int y;

    Punto(void);
    void StampaDati(void);

private:

    int colore;

    friend void CambiaColore(Punto &, int);

};

Punto::Punto(void)
{
    x=0;
    y=0;
    colore=0;
}

void Punto::StampaDati(void)
{
    cout<<"Ascisse:"<<x<<endl;
    cout<<"Ordinata:"<<y<<endl;
    cout<<"Colore:"<<colore<<endl;

}

 void CambiaColore(Punto &a, int c)
{
    Punto P;
    P.colore = c;
    P.StampaDati();
}


int main()
{
    cout << "Le funzioni amiche :)" << endl;

    Punto a;
    CambiaColore(a, 10);
    return 0;
}
 
No, non funziona. Compila, ma la tua implementazione del metodo CambiaColore è completamente sbagliata.
E se avessi aggiunto stampaDati alla fine del main te ne saresti accorto subito.
PS guarda il codice di @DispatchCode
 
void CambiaColore(Punto &a, int c) { Punto P; P.colore = c; P.StampaDati(); } int main() { cout << "Le funzioni amiche :)" << endl; Punto a; CambiaColore(a, 10); return 0; }

Sono concetti base della OOP questi. L'oggetto Punto istanziato nel main non è l'oggetto Punto che istanzi nella funzione, sono appunto due istanze diverse.
Scusa poi: secondo te, perchè passare il riferimento all'oggetto al metodo CambiaColori? Non è solo per far compilare il codice...
 
Sono concetti base della OOP questi. …
Che poi a dire il vero quello è un concetto generale di programmazione, non solo di OOP e nemmeno del linguaggio C. È un concetto base.
--- i due messaggi sono stati uniti ---
Domanda a @regedit : quanti anni hai, che scuola frequenti e quale è il tuo libro di testo. Ok, sono tre domande :)
 
Pubblicità
Pubblicità
Indietro
Top