DOMANDA Codice C++ class friend non funziona

Dema.King84

Utente Attivo
506
57
si, devo sicuramente ripassarmi meglio l' uso delle funzioni. ora sembra che il codice stia migliorando devo solo modificare alcune cose nel main
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Al termine delle modifiche o se ti blocchi, pubblica nuovamente dove sei arrivato, così vediamo.
 
  • Mi piace
Reazioni: Dema.King84

Dema.King84

Utente Attivo
506
57
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"
 

Andretti60

Utente Èlite
6,440
5,091
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’
 
  • Mi piace
Reazioni: DispatchCode

Dema.King84

Utente Attivo
506
57
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?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: Dema.King84

Dema.King84

Utente Attivo
506
57
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.

 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: Dema.King84

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: Dema.King84

Dema.King84

Utente Attivo
506
57
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 ?
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
 

Dema.King84

Utente Attivo
506
57
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;
}
 

Andretti60

Utente Èlite
6,440
5,091
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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...
 
  • Mi piace
Reazioni: Andretti60

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili