Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-07-2012, 18:49   #1
oRpo
Senior Member
 
L'Avatar di oRpo
 
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 377
[C++] Metodo const e modifiche sull'oggetto di invocazione - Best Practise

Salve a tutti.
Un metodo dovrebbe essere dichiarato const se e solo se la sua invocazione non produce side-effects sull'oggetto di invocazione o sulla classe di invocazione.
Supponendo che la classe abbia come campo dato di istanza un puntatore ad una collezione di oggetti (vedi esempio), se dovessi fare un metodo push, questo metodo devo marcarlo come const? A rigor di logica sì. visto che non modificando nessun oggetto di invocazione, provoca comunque side-effect indirettamente.

esempio:

class A
{
vector<int> * punt;
public:
void push(int) const;

...

A(): punt(new vector<int>);
}



Cosa mi consigliate?

Mattia
oRpo è offline   Rispondi citando il messaggio o parte di esso
Old 07-07-2012, 16:39   #2
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
Prendendo come buona la tua definizione di quando una funzione dovrebbe essere const oppure non const, essendo push non referenzialmente trasparente non dovrebbe essere dichiarata const.
Fatti questa domanda: posso sostituire una chiamata alla funzione push con il valore che restituisce senza che nulla cambi nel mio programma?
Se la risposta è sì, allora secondo la tua definizione di quando una funzione dovrebbe essere const ( ma cosa significa side effects sull'oggetto di invocazione? ) oppure no, push deve essere const. Altrimenti non deve esserlo.

Quando si parla di c++, non si dice metodo ma funzione. Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo
__________________

AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB
Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX
Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200

Ultima modifica di __ZERO_UNO__ : 09-07-2012 alle 21:53.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2012, 22:57   #3
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Prendendo come buona la tua definizione di quando una funzione dovrebbe essere const oppure non const, essendo push non referenzialmente trasparente non dovrebbe essere dichiarata const.
Fatti questa domanda: posso sostituire una chiamata alla funzione push con il valore che restituisce senza che nulla cambi nel mio programma?
Se la risposta è sì, allora secondo la tua definizione di quando una funzione dovrebbe essere const ( ma cosa significa side effects sull'oggetto di invocazione? ) oppure no, push deve essere const. Altrimenti non deve esserlo.

Quando si parla di c++, non si dice metodo ma funzione. Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo
Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".
Tutto il resto lo reputo sinceramente uno sciocco gioco di termini che i puristi del c++ usano. (Così come i puristi degli altri linguaggi se la "tirano" in altri frangenti eh)
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 07:51   #4
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Il C++ definisce i metodi come "member function", chiamarli solo funzioni è sbagliato. "Metodi" è genericamente il gergo OOP (mutuato da Smalltalk)
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 15:29   #5
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".
Tutto il resto lo reputo sinceramente uno sciocco gioco di termini che i puristi del c++ usano. (Così come i puristi degli altri linguaggi se la "tirano" in altri frangenti eh)
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
Penso che per uniformità ed evitare ambiguità sia meglio usare i termini funzione membro e funzione globale quando si parla di c++. Inoltre in tutti i testi che trattano di c++ è usata questa convenzione.
__________________

AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB
Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX
Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200

Ultima modifica di __ZERO_UNO__ : 10-07-2012 alle 15:40.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 15:50   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
L'osservazione di Kendall mi pare abbastanza pertinente:
Quote:
Originariamente inviato da Kendall
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".
Puoi usare il termine "metodo" come un sinonimo di "funzione membro" senza questo renda neccessario trovare un sinonimo per "funzione globale", o sbaglio?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 22:52   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da oRpo Guarda i messaggi
Salve a tutti.
Un metodo dovrebbe essere dichiarato const se e solo se la sua invocazione non produce side-effects sull'oggetto di invocazione o sulla classe di invocazione.
Supponendo che la classe abbia come campo dato di istanza un puntatore ad una collezione di oggetti (vedi esempio), se dovessi fare un metodo push, questo metodo devo marcarlo come const?
A rigor di logica sì. visto che non modificando nessun oggetto di invocazione, provoca comunque side-effect indirettamente.
A rigor di logica no visto che logicamente l'oggetto e' stato modificato.
Il fatto che poi tu riesca a modificare un oggetto puntato (ma non il puntatore stesso) secondo me e' poco rilevante o, se preferisci, un dettaglio implementativo.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 22:59   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Quando si parla di c++, non si dice metodo ma funzione.
Si possono usare indifferentemente entrambe le forme, in C++ vogliono dire la medesima cosa.

Quote:
Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo
La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.
Quando qualcuno vuol fare il gradasso su irc e ti chiede cos'e' un metodo puoi pure dargli un link rapidshare ad una copia del libro .

Al di la' di questo il resto del mondo usa il termine metodo, per cui tanto vale usare un linguaggio comune.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2012, 23:02   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
... 'funzione' ? O 'funzione non membro, se occorre evidenziare la differenza.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 10:30   #10
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
Non pensavo di tirare su una discussione così ampia su una cosa così poco rilevante. Comunque mi rimangio la bacchettata che ho fatto e dico ognuno usi la terminologia che preferisce (ovviamente). Affari suoi.

Quote:
Originariamente inviato da marco.r Guarda i messaggi
La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.
Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
Qui mi fermo.
Bye
__________________

AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB
Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX
Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200

Ultima modifica di __ZERO_UNO__ : 11-07-2012 alle 10:33.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 13:24   #11
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da __ZERO_UNO__ Guarda i messaggi
Non pensavo di tirare su una discussione così ampia su una cosa così poco rilevante. Comunque mi rimangio la bacchettata che ho fatto e dico ognuno usi la terminologia che preferisce (ovviamente). Affari suoi.


Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
Qui mi fermo.
Bye
doh, guardando il glossario di Stroustrup non posso che darti ragione. La mia copia del libro e' in italiano (peccati di gioventu'), ed evidentemente e' stata tradotta in modo infelice.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2012, 13:33   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
La mia copia del libro e' in italiano (peccati di gioventu')...
...
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2012, 22:26   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13043
Uno che ha fatto un linguaggio così orribile non dovrebbe parlare di cosa è una funzione o un metodo

Edit: oddio l'ho postato sul serio

Ultima modifica di WarDuck : 12-07-2012 alle 22:31.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 07:20   #14
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Uno che ha fatto un linguaggio così orribile non dovrebbe parlare di cosa è una funzione o un metodo

Edit: oddio l'ho postato sul serio
Se ti candidi ti voto come presidente del consiglio
Per quanto riguarda la sottigliezza metodo/funzione...
"o sono caduto o ho caduto, sempre in terra sono andato" ovverosia l'importante è capirsi.
La parola di Stroutsup non è vangelo e al mio paese "A virtual member function is sometimes called a method" questo significa che una funzione membro virtual si può chiamare anche metodo. In Java sono tutte virtual e quindi sono tutti metodi. In c++ non lo sono, ma comunque a livello di comprensione il discorso fila lo stesso. Per fare i perfettini, abbiamo sprecato tonnellate di byte per scrivere corbellerie che non tolgono né tanto meno aggiungono nulla al post originario.
Per quanto riguarda const...
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Qui c'è una definizione e un esempio che mi pare sufficientemente esplicativo
PS
Quanto preferisco il vecchio C, liscio liscio e semplice.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
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: 17:52.


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