Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-05-2011, 14:58   #1
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
[C++]Help getter & setter e ptr

Salve ragazzi avrei bisogno di una spiegazione un pò dettagliata su questi due metodi e vorrei capirne la sintassi!
Ho capito che servono a dichiarare e a settare il valore della variabile in questione per cui è meglio metterli nel programma...
leggo che serve anche a livello di manutebilità del codice ma qui non capisco molto...cioè alla fine non mi torna troppo dove sta il risparmio di tempo!
C'entra qlcs il puntatore this?
quest'ultimo come funziona?
grazie mille
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2011, 17:04   #2
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Get/Set si usano per avere accesso alle variabili membro di un oggetto, nel caso in cui queste siano state dichiarate "private".

Il nascondere l'accesso alle variabili membro è uno dei metodi con cui realizzato l'incapsulamento. Non si tratta di un metodo per risparmiare tempo.

Non capisco un riferimento al puntatore this, esso non è altro che un riferimento all'oggetto che ha generato la chaimata.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2011, 17:11   #3
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Perché mi pareva che nel set ci foss sempre un this ->
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2011, 21:06   #4
Naufr4g0
Senior Member
 
L'Avatar di Naufr4g0
 
Iscritto dal: Nov 2005
Città: Palermo
Messaggi: 1474
Quote:
Originariamente inviato da Solido Guarda i messaggi
Perché mi pareva che nel set ci foss sempre un this ->
beh si si mette quando vuoi utilizzare come parametro della funzione lo stesso nome della variabile membro dell'oggetto, tipo:

Codice:
void MyClass::SetVar (int var)
{
      this->var = var;
}
In questo modo fai capire al compilatore che si tratta di due var diversi.
Io in genere però metto nomi diversi ed evito il problema:

Codice:
void MyClass::SetVar (int var)
{
      mVar = var;
}
Naufr4g0 è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2011, 11:09   #5
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Quote:
Originariamente inviato da Naufr4g0 Guarda i messaggi
beh si si mette quando vuoi utilizzare come parametro della funzione lo stesso nome della variabile membro dell'oggetto, tipo:

Codice:
void MyClass::SetVar (int var)
{
      this->var = var;
}
In questo modo fai capire al compilatore che si tratta di due var diversi.
Io in genere però metto nomi diversi ed evito il problema:

Codice:
void MyClass::SetVar (int var)
{
      mVar = var;
}

ecco appunto basta cambiare nome!!! ma quel mVar non deve essere dichiarata all'interno di MyClass?

ecco ora ho un dubbio sui costruttori... perchè leggendo i vari libri si perdono in mille esempi ma non mi riesce di capirne la sintassi:
il distruttore basta mettere un ~nomedellaclasse
per i costruttori invece? perchè alle volte vedo i :: alle volte no
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2011, 12:32   #6
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Quote:
Originariamente inviato da Solido Guarda i messaggi
ecco appunto basta cambiare nome!!! ma quel mVar non deve essere dichiarata all'interno di MyClass?
mVar deve essere una variabile membro di MyClass.

Quote:
Originariamente inviato da Solido Guarda i messaggi
ecco ora ho un dubbio sui costruttori... perchè leggendo i vari libri si perdono in mille esempi ma non mi riesce di capirne la sintassi:
il distruttore basta mettere un ~nomedellaclasse
per i costruttori invece? perchè alle volte vedo i :: alle volte no
Se dichiari e implementi una funzione (inclusi costruttori e distruttori, quindi) contestualmente, durante la definizione della classe non c'è necessità di utilizzare l'operatore di scope resolution (ossia il :: ). Attenzione che così facendo le funzioni vengono automaticamente dichiate inline.

Se, invece, dichiari una funzione all'interno della classe e la definisci fuori dalla classe, il compilatore necessita di sapere che la funzione che stai scrivendo si riferisce a quella classe.
Cosa che fai usando la notazione NomeClasse::NomeFunzione().

Data una classe MyClass, comunque, il costruttore (o i costruttori) si chiameranno sempre MyClass, mentre il distruttore ~MyClass.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2011, 13:56   #7
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Quote:
Originariamente inviato da GByTe87 Guarda i messaggi
mVar deve essere una variabile membro di MyClass.



Se dichiari e implementi una funzione (inclusi costruttori e distruttori, quindi) contestualmente, durante la definizione della classe non c'è necessità di utilizzare l'operatore di scope resolution (ossia il :: ). Attenzione che così facendo le funzioni vengono automaticamente dichiate inline.

Se, invece, dichiari una funzione all'interno della classe e la definisci fuori dalla classe, il compilatore necessita di sapere che la funzione che stai scrivendo si riferisce a quella classe.
Cosa che fai usando la notazione NomeClasse::NomeFunzione().

Data una classe MyClass, comunque, il costruttore (o i costruttori) si chiameranno sempre MyClass, mentre il distruttore ~MyClass.

ok quindi i :: funzionano anche per i costruttori?

se ad es ho una classe stack così definita:

class stack{
protected:
int tos;
data*buffer;
int size;

public:
stack(int s);
stack( int s, data v);
~stack(void)
boolean push( data value );
boolean pop ( data* value_ptr);
};

stack:: stack ( int s ) : tos(0), size (s), buffer( new data[s])
{}

ho che il costruttore si riferisce a stack e ne inizializza i dati membro protetti?
e quell' int s in parensi ?
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2011, 14:11   #8
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Si, quello è il costruttore; (int s) indica i parametri da passare al costruttore, in questo caso un intero.

Se ci fai caso, lo stesso intero, (la variabile s) viene passato ai costruttori degli oggetti/variabili membro della classe.

Ti consiglierei, se vuoi darti al C++, di partire con un buon libro; apprendere nozioni in questo modo, mano a mano che incontri cose che non conosci, non è il massimo; rischi di ritrovarti grosse lacune più avanti.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2011, 15:07   #9
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Quote:
Originariamente inviato da GByTe87 Guarda i messaggi
Si, quello è il costruttore; (int s) indica i parametri da passare al costruttore, in questo caso un intero.

Se ci fai caso, lo stesso intero, (la variabile s) viene passato ai costruttori degli oggetti/variabili membro della classe.

Ti consiglierei, se vuoi darti al C++, di partire con un buon libro; apprendere nozioni in questo modo, mano a mano che incontri cose che non conosci, non è il massimo; rischi di ritrovarti grosse lacune più avanti.
ma infatti ho dei libri solo che queste sono le cose che nn sono spiegate ,imho, bene! Gli approcci troppo pratici lasciano delle lacune!

cmq quel valore int s vuol dire che richiama il primo costruttore che accetta solo un paramentro?
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2011, 11:30   #10
Naufr4g0
Senior Member
 
L'Avatar di Naufr4g0
 
Iscritto dal: Nov 2005
Città: Palermo
Messaggi: 1474
Ma invece di partire da queste complesse strutture dati non è meglio fare cose più semplici senza puntatori magari?
Si rischia di impazzire se si comincia così!
Se ti servono strutture dati usa le STL: vector, list, ...

Tornando al discorso dei " :: "

Si usano quando definisce un metodo non in line, cioè fuori dalla dichiarazione della classe

inline:
Codice:
class MyClass {
....
void SetVar (int var) { mVar = var; }
....
}
alternativa:
Codice:
class MyClass
{
    void SetVal(int val);
}

MyClass::SetVal(int val)
{
    mVar = var;
}
Se la scrivi così

Codice:
inline MyClass::SetVal(int val)
{
    mVar = var;
}
è come se l'avessi scritta dentro la definizione della classe come nel primo caso.

Ultima modifica di Naufr4g0 : 19-05-2011 alle 14:50.
Naufr4g0 è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2011, 20:20   #11
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Beh ho messo quell'esempio perchè stavamo trattando argomenti del genere e non perchè mi voglio complicare la vita
cmq grazie mi sei stato piuttosto di aiuto!

però non capisco bene il 3° esempio...
ho visto che inline è una parola chiave, quindi io in quel modo avverto il compilatore della dichiarazione in line. Ma la parola class?
cioè quelle istruzioni seguono la dichiarazione della classe:


class MyClass {
....
void SetVar (int var) { mVar = var; }
....
}

oppure no?

grazie mille
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2011, 23:27   #12
Naufr4g0
Senior Member
 
L'Avatar di Naufr4g0
 
Iscritto dal: Nov 2005
Città: Palermo
Messaggi: 1474
Quindi mi spiego, o fai come nel primo caso

Codice:
class MyClass {
....
void SetVar (int var) { mVar = var; }
....
}
e il metodo è già dichiarato implicitamente inline, oppure scrivi solo il prototipo del metodo

Codice:
void SetVar (int var);
all'interno della definizione della classe e lo implementi all'esterno

Codice:
inline MyClass::SetVal(int val)
{
    mVar = var;
}
ed hai ottenuto due cose equivalenti.
Il motivo per cui c'è questa seconda alternativa è solo per la pulizia del codice.
In genere i prototipi si mettono in un file header (.h) con la definizione della classe, mentre le implementazioni (inline o no che siano) in un file .cpp con lo stesso nome dell'header.
Naufr4g0 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2011, 16:36   #13
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
quindi se ho capito...

nel primo caso definisco il metodoSetVar all'interno della classe e questo mi fa una assegnazione: prendo il parametro di input e lo assegna a mVar
mentre nel secondo caso io dichiaro il prototipo in un header file e lo definisco all'esterno e poi quando lo vorrò utilizzare , ad es nel main, dovrò scrivere:
SetVal( int 5) ad es?
perchè VaL e non VaR?

grazie in anticipo


poi per es ci sono anche questi es con questa sintassi qua:
imageTemplate(int w, int h) : _w(w), _h(h){ _pixels= new T[_w*_h];};
nella tonda ci sono i paramenti che passo a imageTemplate nella graffa c'è la definizione del costruttore mentre " :_w(w), _h(h)" cos'è?

edit: dubbio ulteriore:
tornando all'esempio dello stack che ho fatto ad inizio pagina:
se per dire dopo ho una funzione così:
void client(void)
{
stack S;
stack S2(10);
stack S3(10,20);
...o anche una assegnazione del tipo
sptr= new stack(10,5);
}

in questo caso il compilatore mi dovrebbe automaticamente richiamare il costruttore giusto no?
ma quei nomi: S, S2 ecc... non vanno dichiarati prima?
__________________
Ho concluso felicemente molte trattative su questo forum!

Ultima modifica di Solido : 21-05-2011 alle 17:47.
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2011, 19:12   #14
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Quote:
Originariamente inviato da Solido Guarda i messaggi
quindi se ho capito...

nel primo caso definisco il metodoSetVar all'interno della classe e questo mi fa una assegnazione: prendo il parametro di input e lo assegna a mVar
mentre nel secondo caso io dichiaro il prototipo in un header file e lo definisco all'esterno e poi quando lo vorrò utilizzare , ad es nel main, dovrò scrivere:
SetVal( int 5) ad es?
nomeOggetto.SetVal(5);

Quote:
Originariamente inviato da Solido Guarda i messaggi
perchè VaL e non VaR?
Alle funzioni normali (non costruttori e distruttori) puoi dare il nome che preferisci, quindi non c'è differenza.


Quote:
Originariamente inviato da Solido Guarda i messaggi
poi per es ci sono anche questi es con questa sintassi qua:
imageTemplate(int w, int h) : _w(w), _h(h){ _pixels= new T[_w*_h];};
nella tonda ci sono i paramenti che passo a imageTemplate nella graffa c'è la definizione del costruttore mentre " :_w(w), _h(h)" cos'è?
In questo caso il costruttore di una classe derivata passa dei parametri ai costruttori delle classi da cui deriva. (Molto probabilmente _w e _h sono dei membri della tua classe).

Quote:
Originariamente inviato da Solido Guarda i messaggi
edit: dubbio ulteriore:
tornando all'esempio dello stack che ho fatto ad inizio pagina:
se per dire dopo ho una funzione così:
void client(void)
{
stack S;
stack S2(10);
stack S3(10,20);
...o anche una assegnazione del tipo
sptr= new stack(10,5);
}

in questo caso il compilatore mi dovrebbe automaticamente richiamare il costruttore giusto no?
Si, il compilatore riconosce il costruttore corretto e lo invoca. (l'overload funziona senza problemi anche per i costruttori).

Quote:
Originariamente inviato da Solido Guarda i messaggi
ma quei nomi: S, S2 ecc... non vanno dichiarati prima?
E perchè mai? Sono i nomi delle istanze della classe stack.
La stessa cosa che fai con "int i;", per intenderci.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2011, 19:37   #15
Solido
Senior Member
 
L'Avatar di Solido
 
Iscritto dal: Jan 2004
Città: Figline(FI)
Messaggi: 5847
Quote:
Originariamente inviato da GByTe87 Guarda i messaggi
nomeOggetto.SetVal(5);
OK



Quote:
Originariamente inviato da GByTe87 Guarda i messaggi
Si, il compilatore riconosce il costruttore corretto e lo invoca. (l'overload funziona senza problemi anche per i costruttori).
Ok

Quote:
Originariamente inviato da GByTe87 Guarda i messaggi

E perchè mai? Sono i nomi delle istanze della classe stack.
La stessa cosa che fai con "int i;", per intenderci.
Questi punti ora mi sono chiari, mentre non mi sono chiari gli altri 2:

"Alle funzioni normali (non costruttori e distruttori) puoi dare il nome che preferisci, quindi non c'è differenza."

non capisco come possa scrivere un certo nome nel prototipo e poi utilizzare un altro nome per definire la funzione:

void SetVar (int var);



inline MyClass::SetVal(int val)
{
mVar = var;
}


come fa il compilatore a collegare SetVal e SetVar?


"In questo caso il costruttore di una classe derivata passa dei parametri ai costruttori delle classi da cui deriva. (Molto probabilmente _w e _h sono dei membri della tua classe)."

Che diff c'è allora tra i paramentri _w,_h e quello passato nella parentesi tonda:
imageTemplate(int w, int h) ?

grazie mille per adesso:
ps: che libri hai usato per studiare?
perchè io ho quello di Stroustrup in persona ma non riesce a fugarmi questi dubbi
__________________
Ho concluso felicemente molte trattative su questo forum!
Solido è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2011, 19:43   #16
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Quote:
Originariamente inviato da Solido Guarda i messaggi
"Alle funzioni normali (non costruttori e distruttori) puoi dare il nome che preferisci, quindi non c'è differenza."

non capisco come possa scrivere un certo nome nel prototipo e poi utilizzare un altro nome per definire la funzione:

void SetVar (int var);



inline MyClass::SetVal(int val)
{
mVar = var;
}


come fa il compilatore a collegare SetVal e SetVar?
Sorry, mi ero perso un pezzo. Il nome della funzione nel prototipo e nell'implementazione devono essere uguali. Quindi si, dev'essere SetVar.

Quote:
Originariamente inviato da Solido Guarda i messaggi
"In questo caso il costruttore di una classe derivata passa dei parametri ai costruttori delle classi da cui deriva. (Molto probabilmente _w e _h sono dei membri della tua classe)."

Che diff c'è allora tra i paramentri _w,_h e quello passato nella parentesi tonda:
imageTemplate(int w, int h) ?
Nella parentesi tonda hai i parametri passati dal chiamante, mentre _w e _h saranno le variabili membro della tua classe.


Quote:
Originariamente inviato da Solido Guarda i messaggi
grazie mille per adesso:
ps: che libri hai usato per studiare?
perchè io ho quello di Stroustrup in persona ma non riesce a fugarmi questi dubbi
Diciamo che sto approdando al C++ in questo periodo dopo 3 anni di C puro.
Sto usando come libro "C++: The Complete Reference" di Schildt.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Il TAR annulla Bologna Città 30. ...
Laptop con chip NVIDIA da marzo? Emergon...
Costruito in casa, più veloce di ...
Il nuovo Galaxy Book 6 Pro costa il 25% ...
C'è un boom del mercato dei data ...
OVHcloud annuncia la disponiiblità...
Il Wi-Fi 7 ha un nuovo re: da ASUS arriv...
In arrivo l'auto "Frankenstein"...
Chip NVIDIA H200 in Cina? 'Come vendere ...
iPhone 16 torna super conveniente: ora c...
Offerte Amazon pazzesche: tech, smartpho...
Ubisoft annuncia l'arrivo dei 60 fps per...
Infratel Italia: ecco la nuova mappa del...
Hoover HMC5 in offerta: il battimaterass...
Un'idea 'rivoluzionaria' dal Politecnico...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:05.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v