﻿1
00:00:04,470 --> 00:00:08,280
‫Dus we weten dat we een aantal componenten nodig hebben op onze basis -- klasse.

2
00:00:08,280 --> 00:00:12,570
‫We weten dat we een basisgaas nodig hebben voor het onderste deel van de tank en de toren.

3
00:00:12,600 --> 00:00:15,270
‫We hebben ook een torentjegaas nodig voor het bovenste gedeelte.

4
00:00:15,300 --> 00:00:19,500
‫We hebben een capsule nodig om botsingen aan te kunnen en we hebben een spawnpunt voor projectielen nodig.

5
00:00:19,500 --> 00:00:21,270
‫Dat wordt een scènecomponent.

6
00:00:21,300 --> 00:00:26,460
‫Nu, als we deze dingen eenmaal hebben toegevoegd aan de basis pod-klasse, dan zal alles wat we maken op basis

7
00:00:26,460 --> 00:00:28,320
‫van deze klasse die dingen erven.

8
00:00:28,320 --> 00:00:34,920
‫Dus we kunnen een tank maken op basis van de basis -- en dan kunnen we ook een toren maken op basis van de

9
00:00:34,920 --> 00:00:35,550
‫basis --.

10
00:00:35,700 --> 00:00:39,620
‫En omdat ze gebaseerd zijn op de basispod, erven ze deze componenten.

11
00:00:39,630 --> 00:00:46,800
‫De tank kan zijn eigen basisgaas, zijn eigen torentje-gaas, zijn eigen capsule en zijn eigen projectiel-spawnpunt hebben.

12
00:00:46,800 --> 00:00:52,500
‫En evenzo krijgt de toren zijn eigen basisgaas-turret-maascapsule-component en

13
00:00:52,500 --> 00:00:53,370
‫projectiel-spawn-punt.

14
00:00:53,370 --> 00:00:58,560
‫En we zullen heel snel zien hoe we verschillende meshes aan elk van deze kunnen toewijzen, zodat ze er anders uitzien.

15
00:00:58,560 --> 00:01:00,750
‫We weten dus dat we een aantal componenten nodig hebben.

16
00:01:00,750 --> 00:01:05,490
‫Nu is het tijd om wat componenten aan onze basisklasse toe te voegen.

17
00:01:05,910 --> 00:01:11,400
‫Nu hebben we standaard al een openbare sectie, een beveiligde sectie en de tweede openbare sectie

18
00:01:11,400 --> 00:01:12,240
‫hier beneden.

19
00:01:12,570 --> 00:01:17,520
‫Er zijn verschillende redenen om meerdere openbare secties te hebben en daar zullen we het later over hebben.

20
00:01:17,520 --> 00:01:20,880
‫Maar voor onze componenten gaan we een privégedeelte maken.

21
00:01:22,070 --> 00:01:28,400
‫Zoals je eerder hebt geleerd, is het goed om lidvariabelen privé te hebben, zodat ze alleen

22
00:01:28,400 --> 00:01:31,790
‫toegankelijk zijn vanuit de klasse die ze bezit.

23
00:01:31,790 --> 00:01:33,410
‫We hebben dus een aantal componenten nodig.

24
00:01:33,680 --> 00:01:36,190
‫De eerste die ik ga toevoegen is de capsule.

25
00:01:36,200 --> 00:01:40,760
‫Laten we dus een variabele maken van het type capsulecomponent.

26
00:01:42,160 --> 00:01:44,030
‫Dit wordt nu een aanwijzing.

27
00:01:44,070 --> 00:01:48,880
‫We gaan pointers gebruiken voor de meeste van onze variabelen, zolang het geen basistypes zijn

28
00:01:48,880 --> 00:01:50,340
‫zoals integer of float.

29
00:01:50,350 --> 00:01:55,600
‫En zoals u weet, is dat omdat pointers licht van gewicht zijn, het zijn slechts adressen en ze stellen ons in

30
00:01:55,600 --> 00:01:56,860
‫staat efficiënter te zijn.

31
00:01:56,950 --> 00:02:03,400
‫Dus we hebben deze U-capsulecomponentaanwijzer en we gaan deze capsule-comp een afkorting noemen voor

32
00:02:03,400 --> 00:02:04,030
‫capsulecomponent.

33
00:02:04,030 --> 00:02:11,140
‫Nu, net boven de capsulecomponent, gaan we een onwerkelijke motorspecifieke macro toevoegen en het is jouw eigendom

34
00:02:11,470 --> 00:02:14,020
‫in hoofdletters met zijn eigen haakjes.

35
00:02:14,020 --> 00:02:20,590
‫Je eigendom is een manier om onwerkelijke engine bewust te maken van deze variabele, zodat deze kan deelnemen aan onwerkelijke

36
00:02:20,590 --> 00:02:20,980
‫engines.

37
00:02:20,980 --> 00:02:22,240
‫Reflectie systeem.

38
00:02:22,690 --> 00:02:28,750
‫Het reflectiesysteem stelt ons in staat om dingen te doen zoals deze variabele bloot te stellen aan blauwdrukken en deel te

39
00:02:28,750 --> 00:02:31,060
‫nemen aan het verzamelen van afval en dergelijke.

40
00:02:31,060 --> 00:02:36,400
‫Dus het toevoegen van de you-eigenschap zal iets zijn dat aan onze componenten zal worden toegevoegd terwijl we ze maken.

41
00:02:36,400 --> 00:02:41,980
‫Dus we hebben deze capsulecomponent en omdat we het YOU-capsulecomponenttype gebruiken, moeten we de compiler

42
00:02:41,980 --> 00:02:44,860
‫op de hoogte stellen van dit type.

43
00:02:44,860 --> 00:02:48,250
‫Het weet standaard niet wat een capsulecomponent is.

44
00:02:48,250 --> 00:02:54,640
‫Om de compiler te vertellen wat een capsulecomponent is, zouden we normaal gesproken een headerbestand hier bovenaan opnemen

45
00:02:54,640 --> 00:02:59,680
‫met onze include-richtlijnen als we naar de onwerkelijke motordocumentatie gaan en naar je capsulecomponent

46
00:02:59,710 --> 00:03:05,200
‫zoeken, we kunnen hier zien waar het zegt neem het headerbestand op dat we zouden

47
00:03:05,200 --> 00:03:08,950
‫moeten opnemen om de compiler over de capsulecomponent te vertellen.

48
00:03:08,950 --> 00:03:13,000
‫Nu zouden we dit hier bovenaan kunnen opnemen en dan onze U.

49
00:03:13,000 --> 00:03:18,160
‫Het type capsulecomponent zou door de compiler worden herkend en alles zou geweldig zijn.

50
00:03:18,220 --> 00:03:24,070
‫Maar over het algemeen is het een goede gewoonte om deze dingen te coderen door te proberen dit headerbestand

51
00:03:24,070 --> 00:03:25,720
‫zo klein mogelijk te houden.

52
00:03:25,720 --> 00:03:32,380
‫Telkens wanneer we een headerbestand in dit bestand opnemen, neemt een programma genaamd de preprocessor alle inhoud

53
00:03:32,380 --> 00:03:37,720
‫van dat headerbestand, verwijdert enkele dingen zoals opmerkingen en plakt dan letterlijk alle

54
00:03:37,720 --> 00:03:40,780
‫inhoud van dat headerbestand in dit bestand.

55
00:03:41,050 --> 00:03:46,810
‫Het resultaat is dat dit bestand groter wordt omdat het de inhoud heeft van dat opgenomen bestand en het hier

56
00:03:46,810 --> 00:03:47,530
‫in plakt.

57
00:03:47,530 --> 00:03:50,950
‫We willen alleen dingen opnemen als we ze gebruiken.

58
00:03:50,950 --> 00:03:56,740
‫Dus hoe komen we weg met het niet opnemen van het header-bestand hier in de basis -- header?

59
00:03:56,740 --> 00:04:02,380
‫Welnu, we kunnen iets in C++ gebruiken dat bekend staat als forward-declaratie.

60
00:04:02,380 --> 00:04:07,990
‫We declareren dit u-capsule-componenttype door het class-sleutelwoord als volgt te gebruiken.

61
00:04:08,470 --> 00:04:15,310
‫Merk op dat de compiler dit type nu groen toont wanneer we een variabele forward declareren en vervolgens

62
00:04:15,310 --> 00:04:18,010
‫wegkomen zonder het headerbestand op te nemen.

63
00:04:18,010 --> 00:04:23,830
‫Het vertelt de compiler dat dit een type is, zodat het ons geen IntelliSense-fouten meer geeft, en zegt dat

64
00:04:23,830 --> 00:04:26,170
‫het dit niet als een type herkent.

65
00:04:26,170 --> 00:04:28,150
‫Dit is nu een onvolledig type.

66
00:04:28,150 --> 00:04:34,150
‫Als we dit type daadwerkelijk proberen te gebruiken, hetzij door toegang te krijgen tot leden zoals functies en variabelen, of door te proberen een

67
00:04:34,150 --> 00:04:38,560
‫object van dit type te construeren, krijgen we een foutmelding omdat het een onvolledig type is.

68
00:04:38,560 --> 00:04:44,950
‫We zouden het headerbestand nodig hebben waar we dit type gebruiken om die dingen te doen, zodat we een aanwijzer van een type

69
00:04:44,950 --> 00:04:48,400
‫kunnen declareren om te voorkomen dat we het headerbestand nodig hebben.

70
00:04:48,400 --> 00:04:53,230
‫Maar het is belangrijk op te merken dat we header-bestanden nodig hebben om van bepaalde klassen te erven.

71
00:04:53,230 --> 00:05:00,130
‫Merk op dat deze klasse erft van een vijver en dat het vijverkopbestand hier bovenaan is opgenomen.

72
00:05:00,130 --> 00:05:05,470
‫Dus overerving vereist het headerbestand voor het type waarvan we erven.

73
00:05:05,470 --> 00:05:09,100
‫Dus laten we het hebben over voorwaartse declaratie en waarom we het willen doen.

74
00:05:09,130 --> 00:05:16,120
‫Laten we zeggen dat we een klasse hebben met de naam Base Pon die een aanwijzervariabele van het type capsulecomponent

75
00:05:16,120 --> 00:05:17,020
‫moet hebben.

76
00:05:17,050 --> 00:05:22,060
‫Nu bevindt uw capsulecomponent zich in het headerbestand van de capsulecomponent.

77
00:05:22,060 --> 00:05:28,470
‫Nu gaan we dit type gebruiken op basis van wanneer we een object van de U construeren.

78
00:05:28,480 --> 00:05:30,010
‫Type capsulecomponent.

79
00:05:30,010 --> 00:05:36,820
‫Dus in, gebaseerd op alles wat we echt nodig hebben, is een aanwijzer van het type U-capsulecomponent.

80
00:05:37,000 --> 00:05:44,440
‫Nu is de waarheid gebaseerd op H heeft de implementatiedetails van de capsulecomponentklasse niet echt

81
00:05:44,440 --> 00:05:45,160
‫nodig.

82
00:05:45,160 --> 00:05:50,680
‫Met andere woorden, het hoeft niet te weten hoe de functies zijn gedefinieerd of zelfs hoe groot

83
00:05:50,680 --> 00:05:51,820
‫de capsulecomponentklasse is.

84
00:05:51,850 --> 00:05:55,750
‫Een capsulecomponentaanwijzer heeft dezelfde grootte als elke andere aanwijzer.

85
00:05:55,750 --> 00:05:57,250
‫Het is maar een adres.

86
00:05:57,250 --> 00:05:58,810
‫Nu in de basisplanklasse.

87
00:05:58,810 --> 00:06:01,420
‫We willen de capsulecomponent construeren.

88
00:06:01,510 --> 00:06:08,260
‫Om deze reden moeten we de grootte van een capsulecomponent weten om het geheugen in te delen dat nodig is om

89
00:06:08,260 --> 00:06:09,790
‫dit object te maken.

90
00:06:09,790 --> 00:06:16,330
‫Dus hoewel de kop van de capsulecomponent niet strikt nodig is in de basis Ponca, is het absoluut nodig in de basis.

91
00:06:16,350 --> 00:06:24,970
‫Porkpie Dus een goede programmeerpraktijk is om alleen headers op te nemen waar je ze echt nodig hebt, zodat we weg kunnen komen

92
00:06:24,970 --> 00:06:32,410
‫met het declareren van een aanwijzer van het type U capsulecomponentaanwijzer in basisproduct H en vervolgens capsulecomponenten op te nemen

93
00:06:32,410 --> 00:06:39,310
‫waar we de implementatiedetails nodig hebben omdat we aan het construeren zijn een capsulecomponent en we moeten de

94
00:06:39,310 --> 00:06:41,020
‫grootte van a weten.

95
00:06:41,310 --> 00:06:43,230
‫Capsulecomponent in het geheugen.

96
00:06:43,350 --> 00:06:49,920
‫Laten we nu de gevolgen bespreken van het opnemen van het headerbestand in base pond FX.

97
00:06:50,010 --> 00:06:55,410
‫Zoals we hebben gezien, kunnen we dit absoluut doen en je denkt misschien, nou, we nemen het op in

98
00:06:55,410 --> 00:07:01,230
‫base pont CP Hoe dan ook, dus wat maakt het uit als we het in het ene bestand opnemen versus het andere?

99
00:07:01,260 --> 00:07:03,180
‫Hier komt het probleem om de hoek kijken.

100
00:07:03,210 --> 00:07:07,390
‫Headerbestanden zijn ontworpen om door andere bestanden te worden opgenomen.

101
00:07:07,410 --> 00:07:12,810
‫Dus laten we zeggen dat we Base Pond H hebben en daarin capsulecomponenten hebben opgenomen.

102
00:07:12,810 --> 00:07:18,600
‫Verderop hebben we een andere klasse en we hebben een basisvijveraanwijzer in een andere

103
00:07:18,600 --> 00:07:23,370
‫klasse, net zoals we een capsulecomponentaanwijzer in de basispod hadden.

104
00:07:23,400 --> 00:07:28,230
‫Nu, in plaats van de moeite te nemen om de basispion en een andere klasse

105
00:07:28,230 --> 00:07:33,810
‫naar voren te verklaren, gaan we het gewoon als normaal verklaren en de basispion in een andere klasse opnemen.

106
00:07:34,680 --> 00:07:41,520
‫Dus nu bevat Base Pond H niet alleen de kop van de capsulecomponent, waardoor er meer code naar

107
00:07:41,520 --> 00:07:43,190
‫dat kopbestand wordt gekopieerd.

108
00:07:43,200 --> 00:07:47,820
‫Nu heeft een andere klasse een basis, waaronder een capsulecomponent.

109
00:07:47,820 --> 00:07:55,470
‫Dus alle inhoud en capsulecomponenten vallen ook binnen een andere klasse H en het is daar niet

110
00:07:55,470 --> 00:07:56,400
‫eens nodig.

111
00:07:56,400 --> 00:08:01,910
‫Een andere klasse die H alleen over base hoeft te weten, geeft niet om de capsulecomponent.

112
00:08:01,920 --> 00:08:07,920
‫Stel nu dat we dit patroon voortzetten en een andere klasse maken die nog een andere klasse wordt genoemd en dat nog

113
00:08:07,920 --> 00:08:13,680
‫een andere klasse nu misschien een aanwijzer van het type een andere klasse nodig heeft in plaats van voorwaarts declareren.

114
00:08:13,680 --> 00:08:21,180
‫We nemen gewoon een andere klasse H op in weer een andere klasse H en nu in weer een andere klasse H.

115
00:08:21,210 --> 00:08:27,840
‫Ook al hebben we de header voor base pond of capsule component H niet eens nodig, we hebben hem

116
00:08:27,840 --> 00:08:32,730
‫in nog een andere klasse omdat een andere klasse die header-bestanden erin bevat.

117
00:08:32,730 --> 00:08:40,140
‫Dus we hebben kopieën van alle inhoud van capsulecomponenten en gebaseerd op H zit hier gewoon in weer een

118
00:08:40,140 --> 00:08:46,620
‫andere klasse, dat bestand opblazen en de compileertijden verhogen, allemaal omdat we declaratie niet hebben doorgestuurd.

119
00:08:46,620 --> 00:08:52,440
‫Dus in plaats daarvan is het beter om header-bestanden op te nemen waar ze echt nodig zijn.

120
00:08:52,440 --> 00:08:59,610
‫Dus als we capsulecomponenten nemen en deze alleen opnemen op basis van CPP, en later wanneer we

121
00:08:59,610 --> 00:09:05,340
‫een andere klasse maken en daadwerkelijk de basispod moeten gebruiken, kunnen we de koptekst

122
00:09:05,340 --> 00:09:12,840
‫daar opnemen en base op bevat geen capsulecomponenten, dus al die extra code is niet inbegrepen in een andere

123
00:09:12,840 --> 00:09:13,440
‫klasse.

124
00:09:13,440 --> 00:09:18,810
‫En als we dan nog een klasse gaan maken die een andere klasse nodig heeft, kunnen we een andere

125
00:09:18,810 --> 00:09:24,990
‫klasse die h opnemen in nog een andere klasse die CPP waar het echt nodig is en dan nog een andere

126
00:09:24,990 --> 00:09:30,270
‫klasse die H niet gevuld raakt met de inhoud van andere header-bestanden die het niet nodig heeft.

127
00:09:30,270 --> 00:09:36,990
‫Dus wanneer klassen afhankelijkheden hebben zoals deze, gebaseerd op de capsulecomponent, is het het beste om die afhankelijkheden tot

128
00:09:36,990 --> 00:09:38,670
‫een minimum te beperken.

129
00:09:38,880 --> 00:09:42,570
‫Dus ik ga je uitdagen om een compilatiefout te maken.

130
00:09:42,570 --> 00:09:44,970
‫We moeten niet bang zijn voor compilatiefouten.

131
00:09:44,970 --> 00:09:47,550
‫Ze zijn gewoon een normaal onderdeel van het ontwikkelingsproces.

132
00:09:47,550 --> 00:09:54,210
‫Dus we gaan er een genereren die opzettelijk teruggaat en het class-sleutelwoord verwijdert en compileert zonder capsule comp

133
00:09:54,210 --> 00:09:56,160
‫naar voren te declareren.

134
00:09:56,160 --> 00:10:04,080
‫Als ik zeg compileren, bedoel ik dat je kunt compileren vanuit Visual Studio-code, gewoon een gewone C++-compilatie.

135
00:10:04,110 --> 00:10:10,500
‫U hebt geleerd hoe u dat moet doen, of u kunt eenvoudig uw bestand en Visual Studio-code opslaan en

136
00:10:10,500 --> 00:10:11,670
‫live codering starten.

137
00:10:11,670 --> 00:10:16,800
‫Een van beide is prima en als we dit samen doornemen, zal ik je laten zien wat er met beide methoden

138
00:10:16,800 --> 00:10:17,280
‫gebeurt.

139
00:10:17,280 --> 00:10:22,440
‫Als je live codering gebruikt, kijk je natuurlijk naar de gegenereerde uitvoer in het live

140
00:10:22,440 --> 00:10:27,270
‫coderingsvenster in tegenstelling tot de uitvoer die je zou zien in Visual Studio-code.

141
00:10:27,270 --> 00:10:33,060
‫Nu spoiler, je krijgt een compilatiefout, kijk naar de compilatiefoutmelding, kijk wat het

142
00:10:33,060 --> 00:10:34,260
‫je vertelt.

143
00:10:34,470 --> 00:10:38,070
‫Dit is slechts om ons vertrouwd te maken met de fouten die we genereren.

144
00:10:38,070 --> 00:10:43,500
‫Ga hierna heen en weer, declareer capsule comp met het class-sleutelwoord.

145
00:10:43,620 --> 00:10:48,450
‫Als je dat eenmaal hebt gedaan, compileer dan opnieuw, deze keer zou je een succesvolle compilatie moeten krijgen.

146
00:10:48,780 --> 00:10:51,060
‫Pauzeer de video en probeer dit eens.

147
00:10:53,520 --> 00:10:56,350
‫Oké, dus laten we hier wat schade aanrichten aan onze code.

148
00:10:56,370 --> 00:10:58,320
‫Ik ga het trefwoord klasse verwijderen.

149
00:10:58,700 --> 00:11:03,540
‫Oké, dus we hebben geprobeerd te compileren, en hier is de uitvoer in de terminal.

150
00:11:03,570 --> 00:11:09,300
‫Het eerste wat we zien is een fout en het geeft ons een foutcode en er staat dat capsule comp geen

151
00:11:09,300 --> 00:11:10,830
‫lid is van een basispion.

152
00:11:10,860 --> 00:11:17,040
‫We hebben een briefje waarop staat C declaratie van een basispion en dan zien we dat we hierdoor andere

153
00:11:17,040 --> 00:11:17,940
‫fouten krijgen.

154
00:11:17,940 --> 00:11:23,390
‫Dus vaak raken studenten in de war wanneer ze proberen te compileren en lijken ze meerdere fouten te maken.

155
00:11:23,400 --> 00:11:28,560
‫Dit toont dus aan dat een enkele fout een reeks fouten kan verspreiden.

156
00:11:28,560 --> 00:11:31,670
‫En dat betekent niet dat je een hele hoop bestanden moet gaan repareren.

157
00:11:31,680 --> 00:11:34,410
‫De fout kan hier een enkele oorsprong hebben.

158
00:11:34,410 --> 00:11:36,420
‫We weten wat de oorzaak van de fout is.

159
00:11:36,420 --> 00:11:37,820
‫We moeten declaratie doorsturen.

160
00:11:37,830 --> 00:11:45,150
‫Laten we nu eens kijken wat er gebeurt als we live codering gebruiken in plaats van gewone compilatie en Visual Studio-code.

161
00:11:45,150 --> 00:11:51,450
‫Dus ik ga door en klik op de knop om live codering te starten en meteen in het rood zie ik dat

162
00:11:51,450 --> 00:11:54,270
‫de build is mislukt en we zien hier hetzelfde.

163
00:11:54,270 --> 00:11:55,050
‫Hier.

164
00:11:55,050 --> 00:11:59,310
‫Capsule comp is geen lid van een basispion.

165
00:11:59,340 --> 00:12:01,860
‫Zie de verklaring van een basispion.

166
00:12:01,860 --> 00:12:03,750
‫Hier zien we dus hetzelfde.

167
00:12:03,750 --> 00:12:08,490
‫Dus in beide gevallen krijgen we een fout als deze te zien als we vergeten declareren door te sturen.

168
00:12:08,490 --> 00:12:16,170
‫Dus nu weten we hoe het eruit ziet en nu zijn we beter geïnformeerd en minder bang voor deze

169
00:12:16,170 --> 00:12:17,340
‫mysterieuze compilatie-foutmeldingen.

170
00:12:17,460 --> 00:12:23,280
‫Dus wat we gaan doen, is deze fout oplossen door je capsulecomponent door te geven, en dan kunnen

171
00:12:23,280 --> 00:12:24,990
‫we proberen opnieuw te compileren.

172
00:12:24,990 --> 00:12:27,780
‫En nu hebben we gecompileerd zonder fouten.

173
00:12:27,870 --> 00:12:32,070
‫Dus nu zien we hoe het eruit ziet als we vergeten zijn om een variabele vooruit te declareren.

174
00:12:32,100 --> 00:12:35,250
‫Houd daar rekening mee als u in de toekomst compilerfouten krijgt.

175
00:12:35,760 --> 00:12:41,490
‫Dus kort samengevat, we hebben de forward declaratie besproken bij het maken van een nieuwe pointer en we hebben

176
00:12:41,490 --> 00:12:48,370
‫geleerd dat je alleen moet opnemen wat je gebruikt in het CP-bestand en dat we zo weinig mogelijk in het H-bestand moeten

177
00:12:48,450 --> 00:12:49,020
‫opnemen.

178
00:12:49,050 --> 00:12:55,020
‫We weten dat we het headerbestand niet nodig hebben om een nieuwe pointer te declareren zolang we forward declareren en dat

179
00:12:55,020 --> 00:13:00,090
‫we het headerbestand wel nodig hebben als we een object van een bepaald type gaan construeren.

180
00:13:00,090 --> 00:13:05,850
‫En we hebben het headerbestand nodig om toegang te krijgen tot leden zoals functies en variabelen en we zagen dat we

181
00:13:05,850 --> 00:13:09,780
‫het headerbestand echt nodig hebben voor overerving voor het erven van een klasse.

182
00:13:09,780 --> 00:13:11,460
‫We hebben dat header-bestand daar nodig.

183
00:13:11,580 --> 00:13:17,160
‫Dus nu we weten hoe we een type moeten declareren en we onze pointer capsule comp hebben, zijn we klaar

184
00:13:17,160 --> 00:13:21,840
‫om daadwerkelijk een capsulecomponent-object te construeren en dat zullen we in de volgende video doen.

185
00:13:22,200 --> 00:13:23,040
‫Ik zie je snel.

