﻿1
00:00:04,410 --> 00:00:05,340
‫Ciao e Benvenuto.

2
00:00:05,340 --> 00:00:10,290
‫In questa lezione impareremo uno strano fenomeno chiamato parametro esterno.

3
00:00:10,290 --> 00:00:17,400
‫Questo è un parametro che invece di passare il valore in C++, tendiamo a passare il valore da una

4
00:00:17,400 --> 00:00:18,000
‫funzione.

5
00:00:18,450 --> 00:00:23,340
‫E vedremo anche qualcosa chiamato riferimento costante e come questi due concetti siano in qualche

6
00:00:23,340 --> 00:00:25,380
‫modo intrecciati l'uno con l'altro.

7
00:00:25,740 --> 00:00:27,720
‫Immergiamoci e scopriamolo.

8
00:00:28,880 --> 00:00:29,150
‫Adesso.

9
00:00:29,150 --> 00:00:36,890
‫Il vero posto in cui brillano i riferimenti è nei parametri delle funzioni, perché ogni volta che

10
00:00:36,890 --> 00:00:45,740
‫creiamo un float delta time come questo nel nostro componente, quello che stiamo facendo è prendere una copia di quel

11
00:00:45,740 --> 00:00:49,520
‫float originale e lo stiamo passando al funzione.

12
00:00:49,520 --> 00:00:55,760
‫Quindi, invece di farlo, quello che potremmo voler fare è prendere un riferimento ad esso e passarlo invece.

13
00:00:56,240 --> 00:01:02,660
‫Quindi immaginiamo di dover creare una funzione per afferrarlo, ciascuna chiamata danno di stampa.

14
00:01:03,140 --> 00:01:09,200
‫E come argomento per questa funzione, vogliamo passare un float damage.

15
00:01:09,470 --> 00:01:14,720
‫Ora, questo, come ho detto, creerà una copia di qualsiasi cosa passiamo e la copierà in quella variabile.

16
00:01:14,720 --> 00:01:18,740
‫Crea questa variabile di parametro all'interno della funzione di danneggiamento della stampa.

17
00:01:19,930 --> 00:01:24,370
‫E abbiamo anche bisogno di avere un valore di ritorno di void qui per completarlo e un punto e virgola alla fine.

18
00:01:24,730 --> 00:01:28,590
‫Entriamo nel C++ e continuiamo questa conversazione.

19
00:01:28,600 --> 00:01:30,790
‫Creiamo il danno di stampa qui.

20
00:01:31,390 --> 00:01:39,250
‫Metti la tua classe davanti ad essa e mettiamo alcune parentesi graffe invece del punto e virgola.

21
00:01:39,820 --> 00:01:48,280
‫Quindi abbiamo una copia nella variabile del parametro del danno ed è sicuro perché se dovessi fare un danno uguale

22
00:01:48,280 --> 00:01:53,950
‫a cinque, cambierò solo questa variabile qui all'interno del danno di stampa.

23
00:01:53,950 --> 00:01:55,390
‫Ne ho una copia mia.

24
00:01:55,630 --> 00:01:57,910
‫Non posso rovinare tutto per caso.

25
00:01:58,180 --> 00:02:01,400
‫E se non volessi farne una copia?

26
00:02:01,420 --> 00:02:04,330
‫La mia alternativa sarebbe prendere un riferimento.

27
00:02:04,630 --> 00:02:10,780
‫Quindi quello che posso fare qui è che posso inserire un riferimento float che va in danno

28
00:02:10,780 --> 00:02:14,260
‫di stampa e devo aggiornarlo anche nel file C++.

29
00:02:14,740 --> 00:02:20,230
‫E poi potrei avere questo messaggio di registro che stiamo usando il riferimento per andiamo a prenderlo e

30
00:02:20,470 --> 00:02:22,540
‫metterlo in un danno di stampa.

31
00:02:22,750 --> 00:02:29,200
‫Quindi ora prendiamo il nostro danno e stiamo stampando gli aggiornamenti dei suoi punti vendita, le dichiarazioni del registro dicono che il danno è un caso

32
00:02:29,470 --> 00:02:30,940
‫di danno, è questo danno.

33
00:02:31,300 --> 00:02:40,060
‫E nel nostro componente tick, quello che possiamo fare è infliggere danni alla stampa e passare nella variabile del danno e mettere il punto e

34
00:02:40,060 --> 00:02:41,230
‫virgola alla fine.

35
00:02:41,590 --> 00:02:48,670
‫E per ora possiamo sbarazzarci del nostro riferimento di danno, perché quello che abbiamo ora è un galleggiante danneggiato

36
00:02:48,670 --> 00:02:51,010
‫che viene creato nella tecnologia.

37
00:02:51,010 --> 00:03:00,100
‫La memoria per questo è stata creata qui in Take e quindi andiamo a darla a questa funzione di danno da stampa.

38
00:03:00,100 --> 00:03:06,640
‫Ma poiché il parametro è un riferimento, in realtà non stiamo copiando questo danno.

39
00:03:06,640 --> 00:03:13,300
‫Stiamo prendendo il suo indirizzo e memorizzandolo invece nel riferimento in modo che quando utilizziamo questo riferimento

40
00:03:13,300 --> 00:03:18,130
‫lungo la linea, stiamo effettivamente accedendo al pezzo di memoria originale.

41
00:03:18,130 --> 00:03:21,930
‫Quindi nessuna copia è stata necessaria per stampare il danno.

42
00:03:21,940 --> 00:03:25,240
‫Ora controlliamo solo che questo stia effettivamente facendo ciò che ci aspetteremmo che facesse.

43
00:03:25,240 --> 00:03:34,000
‫Se cambio il valore del danno a cinque, per esempio, e poi ricompilo e premo play, allora vai a dare un'occhiata al

44
00:03:34,000 --> 00:03:38,410
‫registro di output e alla stampa che il danno è cinque.

45
00:03:38,560 --> 00:03:42,880
‫Ma poiché abbiamo un riferimento, sappiamo che possiamo aggiornare quel valore.

46
00:03:42,880 --> 00:03:48,880
‫Quindi quello che posso fare è che potrei dire all'interno di questa funzione che potrei fare, ehi, il danno dovrebbe essere uguale a due

47
00:03:48,940 --> 00:03:49,750
‫in questo modo.

48
00:03:50,320 --> 00:03:55,300
‫E se non fossi stato attento, se pensassi di avere la mia copia, potrei pensare che va bene.

49
00:03:55,630 --> 00:04:01,540
‫Ma in realtà nel componente tick, quello che abbiamo fatto è aver cambiato le variabili A originali.

50
00:04:01,560 --> 00:04:09,580
‫Se inserisco un piccolo log qui per ispezionare quella variabile di danno originale e mettiamo una percentuale F e passiamo

51
00:04:09,580 --> 00:04:15,670
‫il danno qui, eseguiamo il codice attivo e lo compiliamo e andiamo a giocare.

52
00:04:15,910 --> 00:04:21,850
‫Dai un'occhiata al nostro registro di output e puoi vedere che ora il danno e il danno originale sono

53
00:04:21,850 --> 00:04:22,960
‫stati entrambi modificati.

54
00:04:22,960 --> 00:04:27,400
‫Entrambi sono stati cambiati al numero due, il che non è eccezionale.

55
00:04:27,430 --> 00:04:33,100
‫Sai, potresti accidentalmente fare molti danni, scusando il gioco di parole, cambiando variabili che

56
00:04:33,100 --> 00:04:35,500
‫non ti aspettavi di cambiare.

57
00:04:36,010 --> 00:04:41,170
‫E qui arriva un altro uso di quella parola chiave const che abbiamo visto in passato.

58
00:04:41,620 --> 00:04:49,570
‫Se metto const davanti al mio riferimento float, quello che sto dicendo qui è che questo dovrebbe essere

59
00:04:49,570 --> 00:04:52,510
‫un riferimento che non puoi cambiare.

60
00:04:52,510 --> 00:04:56,290
‫Non puoi chiamare nessuna funzione senza contatto su di esso, non puoi impostarlo.

61
00:04:56,500 --> 00:05:00,370
‫Non puoi in alcun modo modificare il contenuto di questa variabile.

62
00:05:00,370 --> 00:05:04,360
‫Puoi solo usarlo, puoi solo leggerlo, puoi solo vedere cosa c'è dentro.

63
00:05:04,450 --> 00:05:10,540
‫Quindi, se torniamo indietro, prendo una copia, dobbiamo assicurarci di inserire anche Const qui nei parametri e

64
00:05:10,540 --> 00:05:17,170
‫possiamo andare avanti e compilare e vedi che otteniamo un errore di compilazione e l'errore sta dicendo che il

65
00:05:17,170 --> 00:05:21,850
‫danno non può essere assegnato ad esso perché è una variabile costante.

66
00:05:22,270 --> 00:05:25,000
‫In modo che ci dia la protezione di cui abbiamo bisogno.

67
00:05:25,390 --> 00:05:32,890
‫Quindi, in generale, se stiamo cercando di passare una variabile, in modo efficiente in cui non vogliamo farne

68
00:05:32,890 --> 00:05:38,770
‫una copia, useremo sempre, sempre la parola chiave contact oltre a utilizzare un

69
00:05:39,010 --> 00:05:43,630
‫riferimento perché questo ci impedisce di modificare accidentalmente quel contenuto.

70
00:05:44,290 --> 00:05:50,350
‫Ora, tuttavia, a volte vuoi usarlo per cambiare quel valore.

71
00:05:50,680 --> 00:05:58,750
‫E quello che potremmo avere come esempio, potremmo avere un valore di ritorno booleano e potremmo voler dire che ha

72
00:05:58,750 --> 00:06:06,580
‫un danno, ma potremmo anche, come abbiamo fatto in Blueprint in passato, voler avere un secondo valore di ritorno.

73
00:06:06,580 --> 00:06:10,640
‫Quindi potremmo dire, abbiamo qualche danno e qual è quel danno?

74
00:06:10,780 --> 00:06:19,060
‫Bene, in questo caso, ha effettivamente senso usare un semplice riferimento senza contatto, un riferimento float.

75
00:06:19,530 --> 00:06:26,580
‫Il danno, e in genere lo chiameremmo effettivamente danno solo per rendere davvero visibile che si

76
00:06:26,580 --> 00:06:29,280
‫tratta di un cosiddetto parametro out.

77
00:06:29,310 --> 00:06:31,110
‫Non è un parametro per passare le cose.

78
00:06:31,140 --> 00:06:33,360
‫È un parametro per passare le cose.

79
00:06:33,630 --> 00:06:38,190
‫Ora, può essere un po' una stranezza del C++ e può essere difficile da individuare.

80
00:06:38,490 --> 00:06:44,250
‫Ma in generale, se vedi dei parametri che sono un riferimento ma non

81
00:06:44,520 --> 00:06:50,700
‫sono contrassegnati come contatti, puoi praticamente presumere che qualcuno intendesse usarlo come parametro out.

82
00:06:51,090 --> 00:06:52,530
‫Quindi è quello che abbiamo qui.

83
00:06:52,530 --> 00:06:53,750
‫Abbiamo un danno.

84
00:06:53,760 --> 00:07:01,380
‫E se dovessimo implementarlo nel CPP, allora possiamo mettere la classe you grab qui davanti

85
00:07:01,380 --> 00:07:05,700
‫e possiamo mettere qui le parentesi graffe.

86
00:07:06,120 --> 00:07:10,620
‫Commenteremo il danno di stampa dell'impronta della linea di cui non è soddisfatto perché stiamo cercando di

87
00:07:10,620 --> 00:07:12,170
‫impostare un riferimento di contatto.

88
00:07:12,780 --> 00:07:19,680
‫E essenzialmente quello che potremmo fare qui è che potremmo fare del codice, potremmo vedere se abbiamo qualche

89
00:07:19,680 --> 00:07:22,170
‫danno e poi stampare, sì, ok.

90
00:07:22,200 --> 00:07:25,430
‫I danni sono cinque.

91
00:07:25,440 --> 00:07:29,610
‫Quindi questo è il danno che è stato fatto e possiamo tornare.

92
00:07:29,760 --> 00:07:36,480
‫Vero, perché abbiamo qualche danno che è stato fatto e ora possiamo usarlo in qualcosa come

93
00:07:36,510 --> 00:07:39,870
‫i componenti TEC per recuperare il danno.

94
00:07:40,470 --> 00:07:46,020
‫Quindi qui invece di impostare il danno cinque, potremmo ottenere il danno e stamparlo se

95
00:07:46,020 --> 00:07:53,790
‫c'è qualche danno così possiamo dire qualcosa del genere se ha un danno e quindi passiamo alla variabile che vogliamo

96
00:07:53,790 --> 00:07:56,490
‫venga popolata con il danno .

97
00:07:56,760 --> 00:08:04,980
‫Quindi il danno, ad esempio, e quindi possiamo avere il corpo della nostra dichiarazione e potremmo solo chiamare danno

98
00:08:04,980 --> 00:08:11,700
‫di stampa, ad esempio, se c'è un danno da visualizzare e possiamo rimuoverlo, registri completamente.

99
00:08:12,150 --> 00:08:19,320
‫Quindi questo è il modo in cui utilizziamo i riferimenti senza contatto come parametri esterni, un modo per ottenere più valori

100
00:08:19,320 --> 00:08:21,240
‫di ritorno da una funzione.

101
00:08:21,540 --> 00:08:27,450
‫E in genere quando lo facciamo, quando chiamiamo questa funzione, creeremo la variabile, ma non

102
00:08:27,450 --> 00:08:29,640
‫le daremo un valore iniziale.

103
00:08:29,940 --> 00:08:34,260
‫Quindi sulla riga 39, in pratica ho definito un danno galleggiante.

104
00:08:34,560 --> 00:08:36,990
‫Lo passo subito nella riga successiva.

105
00:08:36,990 --> 00:08:41,590
‫E questo è un altro segno rivelatore che stai usando un parametro out.

106
00:08:42,120 --> 00:08:48,390
‫Non ho dato alcun valore prima di averlo passato in una funzione significa che mi aspetto che

107
00:08:48,390 --> 00:08:51,390
‫quella funzione inserisca il valore per me.

108
00:08:51,690 --> 00:08:55,350
‫Quindi questo può essere difficile da individuare all'inizio e può creare un po' di confusione.

109
00:08:55,560 --> 00:08:58,200
‫Ma queste sono le due regole che vorrei che ricordaste.

110
00:08:58,200 --> 00:09:04,290
‫Se vedi una variabile dichiarata ea cui non viene assegnato un valore e viene passata istantaneamente a una funzione, chiediti se si

111
00:09:04,380 --> 00:09:05,880
‫tratta di un parametro out.

112
00:09:05,880 --> 00:09:12,390
‫E l'altra regola è se vedi un riferimento come parametro, ma non è contenuto, allora potrebbe anche essere

113
00:09:12,390 --> 00:09:15,420
‫un suggerimento che questo è un parametro out.

114
00:09:15,720 --> 00:09:21,780
‫E ovviamente, se la variabile o il parametro ha un nome, allora è un chiaro indizio che questa

115
00:09:21,780 --> 00:09:23,940
‫cosa dovrebbe essere un parametro out.

116
00:09:24,360 --> 00:09:24,890
‫Roba fantastica.

117
00:09:24,900 --> 00:09:28,850
‫Penso che questo ci abbia preparato molto bene per essere in grado di fare una spazzata.

118
00:09:28,860 --> 00:09:30,750
‫Allora ci vediamo alla prossima lezione.

