﻿1
00:00:04,470 --> 00:00:08,280
‫Entonces sabemos que necesitamos algunos componentes en nuestra clase base.

2
00:00:08,280 --> 00:00:12,570
‫Sabemos que necesitamos una malla base para la parte inferior del tanque y la torreta.

3
00:00:12,600 --> 00:00:15,270
‫También necesitamos una malla de torreta para la parte superior.

4
00:00:15,300 --> 00:00:19,500
‫Necesitamos una cápsula para manejar la colisión y necesitamos un punto de generación de proyectiles.

5
00:00:19,500 --> 00:00:21,270
‫Eso va a ser un componente de la escena.

6
00:00:21,300 --> 00:00:26,460
‫Ahora, una vez que hayamos agregado estas cosas a la clase de pod base, todo lo que creemos basado

7
00:00:26,460 --> 00:00:28,320
‫en esta clase heredará esas cosas.

8
00:00:28,320 --> 00:00:34,920
‫Así que podríamos crear un tanque basado en la base, y luego podríamos ir y crear una torre también basada en

9
00:00:34,920 --> 00:00:35,550
‫la base.

10
00:00:35,700 --> 00:00:39,620
‫Y debido a que se basan en el pod base, heredan estos componentes.

11
00:00:39,630 --> 00:00:46,380
‫El tanque puede tener su propia malla de base, su propia malla de torreta, su propia cápsula y su propio punto de generación de

12
00:00:46,380 --> 00:00:46,800
‫proyectiles.

13
00:00:46,800 --> 00:00:52,500
‫Y del mismo modo, la torre obtendrá su propio componente de cápsula de malla de torreta de malla base y también un punto de

14
00:00:52,500 --> 00:00:53,370
‫generación de proyectiles.

15
00:00:53,370 --> 00:00:58,560
‫Y veremos muy pronto cómo podemos asignar diferentes mallas a cada uno de estos para que se vean diferentes.

16
00:00:58,560 --> 00:01:00,750
‫Así que sabemos que necesitamos algunos componentes.

17
00:01:00,750 --> 00:01:05,490
‫Ahora es el momento de agregar algunos componentes a nuestra clase base.

18
00:01:05,910 --> 00:01:11,400
‫Ahora, por defecto, ya tenemos una sección pública, una sección protegida y la segunda sección pública

19
00:01:11,400 --> 00:01:12,240
‫aquí abajo.

20
00:01:12,570 --> 00:01:17,520
‫Hay varias razones para tener múltiples secciones públicas y hablaremos de ellas más adelante.

21
00:01:17,520 --> 00:01:20,880
‫Pero para nuestros componentes, vamos a crear una sección privada.

22
00:01:22,070 --> 00:01:28,400
‫Como aprendió anteriormente, es bueno que las variables miembro sean privadas, de modo que solo sean accesibles

23
00:01:28,400 --> 00:01:31,790
‫desde dentro de la clase que las posee.

24
00:01:31,790 --> 00:01:33,410
‫Así que necesitamos algunos componentes.

25
00:01:33,680 --> 00:01:36,190
‫El primero que voy a añadir es la cápsula.

26
00:01:36,200 --> 00:01:40,760
‫Así que vamos a crear una variable de tipo componente de cápsula.

27
00:01:42,160 --> 00:01:44,030
‫Ahora esto va a ser un puntero.

28
00:01:44,070 --> 00:01:48,880
‫Vamos a usar punteros para la mayoría de nuestras variables siempre que no sean tipos base

29
00:01:48,880 --> 00:01:50,340
‫como entero o flotante.

30
00:01:50,350 --> 00:01:55,600
‫Y como saben, eso se debe a que los punteros son livianos, son solo direcciones y nos

31
00:01:55,600 --> 00:01:56,860
‫permiten ser más eficientes.

32
00:01:56,950 --> 00:02:03,400
‫Así que tenemos este indicador de componente de cápsula U y lo llamaremos componente de cápsula como abreviatura de componente de

33
00:02:03,400 --> 00:02:04,030
‫cápsula.

34
00:02:04,030 --> 00:02:11,140
‫Ahora, justo encima del componente de la cápsula, vamos a agregar una macro específica del motor irreal y es de su

35
00:02:11,470 --> 00:02:14,020
‫propiedad en mayúsculas con sus propios paréntesis.

36
00:02:14,020 --> 00:02:20,590
‫Su propiedad es una forma de hacer que el motor irreal sea consciente de esta variable para que pueda participar en los motores

37
00:02:20,590 --> 00:02:20,980
‫irreales.

38
00:02:20,980 --> 00:02:22,240
‫Sistema de reflexión.

39
00:02:22,690 --> 00:02:28,750
‫El sistema de reflexión nos permite hacer cosas como exponer esta variable a planos y participar en la recolección

40
00:02:28,750 --> 00:02:31,060
‫de basura y cosas por el estilo.

41
00:02:31,060 --> 00:02:36,400
‫Entonces, agregar la propiedad you será algo que se agregará a nuestros componentes a medida que los creamos.

42
00:02:36,400 --> 00:02:41,980
‫Así que tenemos este componente de cápsula y debido a que estamos usando el tipo de componente de

43
00:02:41,980 --> 00:02:44,860
‫cápsula TÚ, debemos informarle al compilador sobre este tipo.

44
00:02:44,860 --> 00:02:48,250
‫No sabe por defecto qué es un componente de cápsula.

45
00:02:48,250 --> 00:02:54,640
‫Ahora, normalmente para decirle al compilador qué es un componente de la cápsula, incluiríamos un archivo de encabezado aquí en la

46
00:02:54,640 --> 00:02:59,680
‫parte superior con nuestras directivas de inclusión si vamos a la documentación del motor irreal y

47
00:02:59,710 --> 00:03:05,200
‫buscamos su componente de la cápsula, podemos ver aquí donde dice incluya el archivo de encabezado que necesitaríamos

48
00:03:05,200 --> 00:03:08,950
‫incluir para informar al compilador sobre el componente de la cápsula.

49
00:03:08,950 --> 00:03:13,000
‫Ahora podríamos incluir esto aquí en la parte superior y luego nuestra U.

50
00:03:13,000 --> 00:03:18,160
‫El compilador reconocería el tipo de componente de la cápsula y todo sería perfecto.

51
00:03:18,220 --> 00:03:24,070
‫Pero, en general, una buena práctica cuando se trata de codificar estas cosas es tratar de mantener este archivo de

52
00:03:24,070 --> 00:03:25,720
‫encabezado lo más pequeño posible.

53
00:03:25,720 --> 00:03:32,380
‫Cada vez que incluimos un archivo de encabezado en este archivo, un programa llamado preprocesador toma todo el contenido de

54
00:03:32,380 --> 00:03:37,720
‫ese archivo de encabezado, elimina algunas cosas como comentarios y luego, literalmente, pega todo el contenido

55
00:03:37,720 --> 00:03:40,780
‫de ese archivo de encabezado en este archivo.

56
00:03:41,050 --> 00:03:46,810
‫El resultado es que este archivo se hace más grande porque tiene el contenido de ese archivo incluido y

57
00:03:46,810 --> 00:03:47,530
‫pégalo aquí.

58
00:03:47,530 --> 00:03:50,950
‫Solo queremos incluir cosas cuando las usamos.

59
00:03:50,950 --> 00:03:56,740
‫Entonces, ¿cómo nos salimos con la nuestra sin incluir el archivo de encabezado aquí en el encabezado base?

60
00:03:56,740 --> 00:04:02,380
‫Bueno, podemos usar algo en C++ conocido como declaración directa.

61
00:04:02,380 --> 00:04:07,990
‫Reenviamos la declaración de este tipo de componente de cápsula u usando la palabra clave class como esta.

62
00:04:08,470 --> 00:04:15,310
‫Observe que el compilador ahora muestra este tipo en verde cada vez que reenviamos declarar una variable y luego pudimos salirnos con

63
00:04:15,310 --> 00:04:18,010
‫la nuestra sin incluir su archivo de encabezado.

64
00:04:18,010 --> 00:04:23,830
‫Le dice al compilador que este es un tipo, por lo que ya no nos dará errores de IntelliSense, diciendo

65
00:04:23,830 --> 00:04:26,170
‫que no lo reconoce como un tipo.

66
00:04:26,170 --> 00:04:28,150
‫Ahora bien, este es un tipo incompleto.

67
00:04:28,150 --> 00:04:34,150
‫Si intentamos usar este tipo ya sea accediendo a miembros como funciones y variables o tratando de construir

68
00:04:34,150 --> 00:04:38,560
‫un objeto de este tipo, obtendríamos un error porque es un tipo incompleto.

69
00:04:38,560 --> 00:04:44,950
‫Necesitaríamos incluir el archivo de encabezado siempre que usemos este tipo para hacer esas cosas, de modo que podamos declarar un

70
00:04:44,950 --> 00:04:48,400
‫puntero de un tipo para evitar necesitar el archivo de encabezado.

71
00:04:48,400 --> 00:04:53,230
‫Pero es importante tener en cuenta que necesitamos archivos de encabezado para heredar de clases particulares.

72
00:04:53,230 --> 00:05:00,130
‫Tenga en cuenta que esta clase se hereda de un estanque y el archivo de encabezado del estanque se incluye aquí en la parte superior.

73
00:05:00,130 --> 00:05:05,470
‫Entonces, la herencia requiere el archivo de encabezado para el tipo del que estamos heredando.

74
00:05:05,470 --> 00:05:09,100
‫Así que analicemos la declaración directa y por qué queremos hacerlo.

75
00:05:09,130 --> 00:05:16,120
‫Digamos que tenemos una clase llamada Base Pon que necesita tener una variable de puntero del tipo de componente

76
00:05:16,120 --> 00:05:17,020
‫de cápsula.

77
00:05:17,050 --> 00:05:22,060
‫Ahora su componente de cápsula está en el archivo de encabezado del componente de cápsula.

78
00:05:22,060 --> 00:05:28,470
‫Ahora vamos a usar este tipo en base a cuando construimos un objeto de la U.

79
00:05:28,480 --> 00:05:30,010
‫Tipo de componente de la cápsula.

80
00:05:30,010 --> 00:05:36,820
‫Entonces, en base a todo lo que realmente necesitamos es tener un puntero del componente de cápsula tipo U.

81
00:05:37,000 --> 00:05:44,440
‫Ahora, la verdad se basa en que H en realidad no necesita los detalles de implementación de la clase de componente de

82
00:05:44,440 --> 00:05:45,160
‫la cápsula.

83
00:05:45,160 --> 00:05:50,680
‫En otras palabras, no necesita saber cómo se definen las funciones o incluso qué tan grande es la clase del

84
00:05:50,680 --> 00:05:51,820
‫componente de la cápsula.

85
00:05:51,850 --> 00:05:55,750
‫Un puntero de componente de cápsula tiene el mismo tamaño que cualquier otro puntero.

86
00:05:55,750 --> 00:05:57,250
‫Es solo una dirección.

87
00:05:57,250 --> 00:05:58,810
‫Ahora en la clase del plan base.

88
00:05:58,810 --> 00:06:01,420
‫Queremos construir el componente de la cápsula.

89
00:06:01,510 --> 00:06:08,260
‫Por esta razón, necesitamos saber el tamaño de un componente de cápsula para diseñar la memoria necesaria para

90
00:06:08,260 --> 00:06:09,790
‫crear este objeto.

91
00:06:09,790 --> 00:06:16,330
‫Entonces, si bien el encabezado del componente de la cápsula no es estrictamente necesario en la base Ponca, es absolutamente necesario en la base.

92
00:06:16,350 --> 00:06:24,970
‫Porkpie Entonces, una buena práctica de programación es incluir solo encabezados donde realmente los necesite para que podamos declarar un puntero de

93
00:06:24,970 --> 00:06:32,410
‫tipo U puntero de componente de cápsula en el producto base H y luego incluir componentes de cápsula donde

94
00:06:32,410 --> 00:06:39,310
‫necesitamos los detalles de implementación porque estamos construyendo un componente de la cápsula y necesitamos saber el

95
00:06:39,310 --> 00:06:41,020
‫tamaño de a.

96
00:06:41,310 --> 00:06:43,230
‫Componente de la cápsula en la memoria.

97
00:06:43,350 --> 00:06:49,920
‫Ahora analicemos las consecuencias de incluir el archivo de encabezado en el estanque base FX en su lugar.

98
00:06:50,010 --> 00:06:55,410
‫Como hemos visto, podemos hacer esto absolutamente y usted puede estar pensando, bueno, lo estamos incluyendo

99
00:06:55,410 --> 00:07:01,230
‫en base pont CP De todos modos, entonces, ¿qué diferencia hay si lo incluimos en un archivo u otro?

100
00:07:01,260 --> 00:07:03,180
‫Ahora aquí es donde viene el problema.

101
00:07:03,210 --> 00:07:07,390
‫Los archivos de encabezado están diseñados para ser incluidos por otros archivos.

102
00:07:07,410 --> 00:07:12,810
‫Así que digamos que tenemos Base Pond H y hemos incluido componentes de cápsulas en él.

103
00:07:12,810 --> 00:07:18,600
‫Y luego, más adelante, tenemos otra clase y vamos a tener un puntero de estanque base en otra clase,

104
00:07:18,600 --> 00:07:23,370
‫al igual que teníamos un puntero de componente de cápsula en la vaina base.

105
00:07:23,400 --> 00:07:28,230
‫Ahora, en lugar de tomarnos la molestia de declarar hacia adelante el puntero del estanque

106
00:07:28,230 --> 00:07:33,810
‫base y alguna otra clase, simplemente lo declararemos como normal e incluiremos el peón base en alguna otra clase.

107
00:07:34,680 --> 00:07:41,520
‫Entonces, ahora Base Pond H no solo incluye el encabezado del componente de la cápsula, lo que da como resultado que se copie más código

108
00:07:41,520 --> 00:07:43,190
‫en ese archivo de encabezado.

109
00:07:43,200 --> 00:07:47,820
‫Ahora alguna otra clase tiene base, que incluye el componente de la cápsula.

110
00:07:47,820 --> 00:07:55,470
‫Entonces, todo el contenido y los componentes de la cápsula también están dentro de alguna otra clase H y ni siquiera se

111
00:07:55,470 --> 00:07:56,400
‫necesitan allí.

112
00:07:56,400 --> 00:08:01,910
‫Alguna otra clase que H solo necesita saber sobre la base de que no se preocupa por el componente de la cápsula.

113
00:08:01,920 --> 00:08:07,920
‫Ahora digamos que continuamos con este patrón y creamos alguna otra clase llamada otra clase más, y es posible que

114
00:08:07,920 --> 00:08:13,680
‫otra clase necesite tener un puntero de tipo alguna otra clase ahora en lugar de declarar hacia adelante.

115
00:08:13,680 --> 00:08:21,180
‫Solo incluimos otra clase H en otra clase H y ahora dentro de otra clase H.

116
00:08:21,210 --> 00:08:27,840
‫Aunque ni siquiera necesitamos el encabezado para el estanque base o el componente H de la cápsula, lo tenemos

117
00:08:27,840 --> 00:08:32,730
‫en otra clase porque otra clase incluye esos archivos de encabezado dentro de él.

118
00:08:32,730 --> 00:08:40,140
‫Así que tenemos copias de todos los contenidos de los componentes de la cápsula y basados en H simplemente atascados aquí en

119
00:08:40,140 --> 00:08:46,620
‫otra clase más, inflando ese archivo y aumentando los tiempos de compilación, todo porque no reenviamos la declaración.

120
00:08:46,620 --> 00:08:52,440
‫Entonces, en cambio, lo mejor que puede hacer es incluir archivos de encabezado donde realmente se necesitan.

121
00:08:52,440 --> 00:08:59,610
‫Entonces, si tomamos los componentes de la cápsula y solo los incluimos en función del CPP, luego, más adelante, cuando creamos

122
00:08:59,610 --> 00:09:05,340
‫alguna otra clase y realmente necesitamos usar el módulo base, podemos incluir el encabezado allí y

123
00:09:05,340 --> 00:09:12,840
‫la base no incluye los componentes de la cápsula. por lo que todo ese código adicional no está incluido en alguna otra

124
00:09:12,840 --> 00:09:13,440
‫clase.

125
00:09:13,440 --> 00:09:18,810
‫Y luego, cuando vamos y creamos otra clase que necesita otra clase, podemos incluir otra clase

126
00:09:18,810 --> 00:09:24,990
‫que h en otra clase más que CPP donde realmente se necesita y luego otra clase más que

127
00:09:24,990 --> 00:09:30,270
‫H no se llena con el contenido de otros archivos de encabezado que no necesita.

128
00:09:30,270 --> 00:09:36,990
‫Entonces, cuando las clases tienen dependencias como esta basadas en el componente de la cápsula, es mejor mantener

129
00:09:36,990 --> 00:09:38,670
‫esas dependencias al mínimo.

130
00:09:38,880 --> 00:09:42,570
‫Así que voy a desafiarte a que crees un error de compilación.

131
00:09:42,570 --> 00:09:44,970
‫No debemos temer los errores de compilación.

132
00:09:44,970 --> 00:09:47,550
‫Son sólo una parte normal del proceso de desarrollo.

133
00:09:47,550 --> 00:09:54,210
‫Así que vamos a generar uno intencionalmente, retroceder y eliminar la palabra clave de clase y compilar sin

134
00:09:54,210 --> 00:09:56,160
‫declarar hacia adelante cápsula comp.

135
00:09:56,160 --> 00:10:04,080
‫Ahora, cuando digo compilar, quiero decir que puede compilar desde el código de Visual Studio, solo una compilación normal de C++.

136
00:10:04,110 --> 00:10:10,500
‫Aprendió cómo hacerlo, o simplemente puede guardar su archivo y el código de Visual Studio e iniciar la

137
00:10:10,500 --> 00:10:11,670
‫codificación en vivo.

138
00:10:11,670 --> 00:10:16,800
‫Cualquiera de los dos está bien y una vez que analicemos esto juntos, te mostraré lo que sucede con ambos

139
00:10:16,800 --> 00:10:17,280
‫métodos.

140
00:10:17,280 --> 00:10:22,440
‫Si usa la codificación en vivo, por supuesto que verá la salida generada en la ventana de codificación

141
00:10:22,440 --> 00:10:27,270
‫en vivo en lugar de la salida que vería en el código de Visual Studio.

142
00:10:27,270 --> 00:10:33,060
‫Ahora, spoiler, obtendrá un error de compilación, mire el mensaje de error de compilación, vea lo

143
00:10:33,060 --> 00:10:34,260
‫que le dice.

144
00:10:34,470 --> 00:10:38,070
‫Esto es solo para familiarizarnos con los errores que generamos.

145
00:10:38,070 --> 00:10:43,500
‫Luego, después de esto, retroceda y avance, declare la composición de la cápsula usando la palabra clave de clase.

146
00:10:43,620 --> 00:10:48,450
‫Una vez que haya hecho eso, vuelva a compilar, debería obtener una compilación exitosa esta vez.

147
00:10:48,780 --> 00:10:51,060
‫Pausa el video y pruébalo.

148
00:10:53,520 --> 00:10:56,350
‫Muy bien, vamos a causar estragos en nuestro código aquí.

149
00:10:56,370 --> 00:10:58,320
‫Voy a eliminar la palabra clave class.

150
00:10:58,700 --> 00:11:03,540
‫Bien, hemos intentado compilar, y aquí está el resultado en la terminal.

151
00:11:03,570 --> 00:11:09,300
‫Lo primero que vemos es un error y nos da un código de error y dice que la composición de la cápsula no

152
00:11:09,300 --> 00:11:10,830
‫es miembro de un peón base.

153
00:11:10,860 --> 00:11:17,040
‫Tenemos una nota que dice declaración C de un peón base y luego vemos que tenemos otros errores como resultado

154
00:11:17,040 --> 00:11:17,940
‫de esto.

155
00:11:17,940 --> 00:11:23,390
‫Entonces, a menudo, los estudiantes se confunden cuando intentan compilar y parecen tener múltiples errores.

156
00:11:23,400 --> 00:11:28,560
‫Así que esto demuestra que un solo error puede propagar una serie de errores.

157
00:11:28,560 --> 00:11:31,670
‫Y eso no significa que tengas que ir y arreglar un montón de archivos.

158
00:11:31,680 --> 00:11:34,410
‫El error podría tener un único origen aquí.

159
00:11:34,410 --> 00:11:36,420
‫Sabemos cuál es el origen del error.

160
00:11:36,420 --> 00:11:37,820
‫Necesitamos reenviar declarar.

161
00:11:37,830 --> 00:11:45,150
‫Ahora veamos qué sucede si usamos la codificación en vivo en lugar de la compilación normal y el código de Visual Studio.

162
00:11:45,150 --> 00:11:51,450
‫Así que seguiré adelante y haré clic en el botón para iniciar la codificación en vivo y de inmediato en rojo veo

163
00:11:51,450 --> 00:11:54,270
‫que la compilación falló y vemos lo mismo aquí.

164
00:11:54,270 --> 00:11:55,050
‫Aquí mismo.

165
00:11:55,050 --> 00:11:59,310
‫Capsule comp no es miembro de una nota de empeño base.

166
00:11:59,340 --> 00:12:01,860
‫Ver la declaración de un peón base.

167
00:12:01,860 --> 00:12:03,750
‫Así que vemos lo mismo aquí.

168
00:12:03,750 --> 00:12:08,490
‫Entonces, en cualquier caso, veremos un error como este cuando olvidemos declarar hacia adelante.

169
00:12:08,490 --> 00:12:16,170
‫Así que ahora sabemos cómo se ve y ahora estamos más informados y menos temerosos de estos misteriosos mensajes de

170
00:12:16,170 --> 00:12:17,340
‫error de compilación.

171
00:12:17,460 --> 00:12:23,280
‫Entonces, lo que vamos a hacer es corregir este error declarando hacia adelante su componente de cápsula, y

172
00:12:23,280 --> 00:12:24,990
‫luego podemos intentar compilar nuevamente.

173
00:12:24,990 --> 00:12:27,780
‫Y ahora hemos compilado sin ningún error.

174
00:12:27,870 --> 00:12:32,070
‫Así que ahora vemos cómo se ve cuando nos olvidamos de declarar una variable.

175
00:12:32,100 --> 00:12:35,250
‫Tenga eso en cuenta cuando tenga errores del compilador en el futuro.

176
00:12:35,760 --> 00:12:41,490
‫Entonces, en resumen, discutimos la declaración directa al crear un nuevo puntero y aprendimos que

177
00:12:41,490 --> 00:12:48,370
‫solo debe incluir lo que usa en el archivo CP y debemos incluir lo menos posible en el archivo

178
00:12:48,450 --> 00:12:49,020
‫H.

179
00:12:49,050 --> 00:12:55,020
‫Sabemos que no necesitamos el archivo de encabezado para declarar un nuevo puntero, siempre que reenviemos la declaración y que

180
00:12:55,020 --> 00:13:00,090
‫sí necesitamos el archivo de encabezado si vamos a construir un objeto de un tipo particular.

181
00:13:00,090 --> 00:13:05,850
‫Y necesitamos el archivo de encabezado para acceder a miembros como funciones y variables y vimos que en

182
00:13:05,850 --> 00:13:09,780
‫realidad necesitamos el archivo de encabezado para heredar de una clase.

183
00:13:09,780 --> 00:13:11,460
‫Necesitamos ese archivo de encabezado allí.

184
00:13:11,580 --> 00:13:17,160
‫Así que ahora que sabemos cómo reenviar declarar un tipo y tenemos nuestra composición de cápsula de puntero, estamos listos

185
00:13:17,160 --> 00:13:21,840
‫para construir un objeto de componente de cápsula y lo haremos en el siguiente video.

186
00:13:22,200 --> 00:13:23,040
‫Te veré pronto.

