﻿1
00:00:04,470 --> 00:00:08,280
‫Então sabemos que precisamos de alguns componentes em nossa base -- class.

2
00:00:08,280 --> 00:00:12,570
‫Sabemos que precisamos de uma malha de base para a parte inferior do tanque e a torre.

3
00:00:12,600 --> 00:00:15,270
‫Também precisamos de uma malha de torre para a parte superior.

4
00:00:15,300 --> 00:00:19,500
‫Precisamos de uma cápsula para lidar com a colisão e precisamos de um ponto de geração de projéteis.

5
00:00:19,500 --> 00:00:21,270
‫Isso vai ser um componente de cena.

6
00:00:21,300 --> 00:00:26,460
‫Agora, uma vez que adicionamos essas coisas à classe base do pod, qualquer coisa que criarmos com

7
00:00:26,460 --> 00:00:28,320
‫base nessa classe herdará essas coisas.

8
00:00:28,320 --> 00:00:34,920
‫Então poderíamos criar um tanque baseado na base -- e então poderíamos ir e criar uma torre também baseada na base

9
00:00:34,920 --> 00:00:35,550
‫--.

10
00:00:35,700 --> 00:00:39,620
‫E como eles são baseados no pod base, eles herdam esses componentes.

11
00:00:39,630 --> 00:00:46,380
‫O tanque pode ter sua própria malha de base, sua própria malha de torre, sua própria cápsula e seu próprio ponto de geração de

12
00:00:46,380 --> 00:00:46,800
‫projéteis.

13
00:00:46,800 --> 00:00:52,500
‫E da mesma forma, a torre terá seu próprio componente de cápsula de malha de torre de malha de base e ponto de desova

14
00:00:52,500 --> 00:00:53,370
‫de projéteis também.

15
00:00:53,370 --> 00:00:58,560
‫E veremos muito em breve como podemos atribuir diferentes malhas a cada uma delas para que pareçam diferentes.

16
00:00:58,560 --> 00:01:00,750
‫Então sabemos que precisamos de alguns componentes.

17
00:01:00,750 --> 00:01:05,490
‫Agora é hora de realmente adicionar alguns componentes à nossa base -- class.

18
00:01:05,910 --> 00:01:11,400
‫Agora, por padrão, já temos uma seção pública, uma seção protegida e a segunda seção pública

19
00:01:11,400 --> 00:01:12,240
‫aqui embaixo.

20
00:01:12,570 --> 00:01:17,520
‫Existem vários motivos para ter várias seções públicas e falaremos sobre isso mais tarde.

21
00:01:17,520 --> 00:01:20,880
‫Mas para nossos componentes, vamos criar uma seção privada.

22
00:01:22,070 --> 00:01:28,400
‫Como você aprendeu anteriormente, é bom que as variáveis de membro sejam privadas, para que sejam acessíveis

23
00:01:28,400 --> 00:01:31,790
‫apenas de dentro da classe que as possui.

24
00:01:31,790 --> 00:01:33,410
‫Então, precisamos de alguns componentes.

25
00:01:33,680 --> 00:01:36,190
‫O primeiro que vou adicionar é a cápsula.

26
00:01:36,200 --> 00:01:40,760
‫Então vamos criar uma variável do tipo seu componente cápsula.

27
00:01:42,160 --> 00:01:44,030
‫Agora isso vai ser um ponteiro.

28
00:01:44,070 --> 00:01:48,880
‫Vamos usar ponteiros para a maioria de nossas variáveis, desde que não sejam tipos base

29
00:01:48,880 --> 00:01:50,340
‫como integer ou float.

30
00:01:50,350 --> 00:01:55,600
‫E como você sabe, é porque os ponteiros são leves, são apenas endereços e nos permitem

31
00:01:55,600 --> 00:01:56,860
‫ser mais eficientes.

32
00:01:56,950 --> 00:02:03,400
‫Portanto, temos esse ponteiro de componente de cápsula U e vamos chamar essa composição de cápsula abreviada de componente de

33
00:02:03,400 --> 00:02:04,030
‫cápsula.

34
00:02:04,030 --> 00:02:11,140
‫Agora, logo acima do componente de cápsula, vamos adicionar uma macro específica do mecanismo irreal e sua propriedade em

35
00:02:11,470 --> 00:02:14,020
‫letras maiúsculas com seus próprios parênteses.

36
00:02:14,020 --> 00:02:20,590
‫Sua propriedade é uma maneira de tornar o mecanismo irreal ciente dessa variável para que ele possa participar de mecanismos

37
00:02:20,590 --> 00:02:20,980
‫irreais.

38
00:02:20,980 --> 00:02:22,240
‫Sistema de Reflexão.

39
00:02:22,690 --> 00:02:28,750
‫O sistema de reflexão nos permite fazer coisas como expor essa variável a blueprints e participar da

40
00:02:28,750 --> 00:02:31,060
‫coleta de lixo e coisas assim.

41
00:02:31,060 --> 00:02:36,400
‫Portanto, adicionar a propriedade you será algo que adicionará aos nossos componentes à medida que os criamos.

42
00:02:36,400 --> 00:02:41,980
‫Portanto, temos esse componente de cápsula e, como estamos usando o tipo de componente de cápsula

43
00:02:41,980 --> 00:02:44,860
‫YOU, precisamos informar o compilador sobre esse tipo.

44
00:02:44,860 --> 00:02:48,250
‫Ele não sabe por padrão o que é um componente de cápsula.

45
00:02:48,250 --> 00:02:54,640
‫Agora, normalmente, para dizer ao compilador o que é um componente de cápsula, incluiríamos um arquivo de cabeçalho aqui no

46
00:02:54,640 --> 00:02:59,680
‫topo com nossas diretivas de inclusão se formos para a documentação do mecanismo irreal e

47
00:02:59,710 --> 00:03:05,200
‫procurarmos seu componente de cápsula, podemos ver aqui onde diz inclua o arquivo de cabeçalho que precisaríamos

48
00:03:05,200 --> 00:03:08,950
‫incluir para informar ao compilador sobre o componente da cápsula.

49
00:03:08,950 --> 00:03:13,000
‫Agora podemos incluir isso aqui no topo e depois nosso U.

50
00:03:13,000 --> 00:03:18,160
‫O tipo de componente da cápsula seria reconhecido pelo compilador e tudo seria ótimo.

51
00:03:18,220 --> 00:03:24,070
‫Mas, em geral, uma boa prática quando se trata de codificar essas coisas é tentar manter esse arquivo

52
00:03:24,070 --> 00:03:25,720
‫de cabeçalho o menor possível.

53
00:03:25,720 --> 00:03:32,380
‫Sempre que incluímos um arquivo de cabeçalho nesse arquivo, um programa chamado pré-processador pega todo o conteúdo desse

54
00:03:32,380 --> 00:03:37,720
‫arquivo de cabeçalho, retira algumas coisas como comentários e, em seguida, cola literalmente todo

55
00:03:37,720 --> 00:03:40,780
‫o conteúdo desse arquivo de cabeçalho nesse arquivo.

56
00:03:41,050 --> 00:03:46,810
‫O resultado é que este arquivo fica maior porque tem o conteúdo desse arquivo incluído e

57
00:03:46,810 --> 00:03:47,530
‫cole-o aqui.

58
00:03:47,530 --> 00:03:50,950
‫Nós só queremos incluir coisas quando as usamos.

59
00:03:50,950 --> 00:03:56,740
‫Então, como podemos nos livrar de não incluir o arquivo de cabeçalho aqui na base -- header?

60
00:03:56,740 --> 00:04:02,380
‫Bem, podemos usar algo em C++ conhecido como declaração de encaminhamento.

61
00:04:02,380 --> 00:04:07,990
‫Declaramos esse tipo de componente de cápsula u usando a palavra-chave class assim.

62
00:04:08,470 --> 00:04:15,310
‫Observe que o compilador agora mostra esse tipo como verde sempre que enviamos a declaração de uma variável e conseguimos evitar

63
00:04:15,310 --> 00:04:18,010
‫a inclusão de seu arquivo de cabeçalho.

64
00:04:18,010 --> 00:04:23,830
‫Ele está dizendo ao compilador que este é um tipo, então ele não nos dará mais erros do IntelliSense, dizendo

65
00:04:23,830 --> 00:04:26,170
‫que ele não reconhece isso como um tipo.

66
00:04:26,170 --> 00:04:28,150
‫Agora este é um tipo incompleto.

67
00:04:28,150 --> 00:04:34,150
‫Se realmente tentarmos usar esse tipo acessando membros como funções e variáveis ou tentando construir um

68
00:04:34,150 --> 00:04:38,560
‫objeto desse tipo, obteremos um erro porque é um tipo incompleto.

69
00:04:38,560 --> 00:04:44,950
‫Precisaríamos do arquivo de cabeçalho incluído sempre que usarmos esse tipo para fazer essas coisas, para que pudéssemos declarar um ponteiro

70
00:04:44,950 --> 00:04:48,400
‫de um tipo para evitar a necessidade do arquivo de cabeçalho.

71
00:04:48,400 --> 00:04:53,230
‫Mas é importante observar que precisamos de arquivos de cabeçalho para herdar de classes específicas.

72
00:04:53,230 --> 00:05:00,130
‫Observe que esta classe herda de uma lagoa e o arquivo de cabeçalho da lagoa está incluído aqui no topo.

73
00:05:00,130 --> 00:05:05,470
‫Portanto, a herança requer o arquivo de cabeçalho para o tipo do qual estamos herdando.

74
00:05:05,470 --> 00:05:09,100
‫Então, vamos discutir a declaração antecipada e por que queremos fazê-la.

75
00:05:09,130 --> 00:05:16,120
‫Digamos que temos uma classe chamada Base Pon que precisa ter uma variável de ponteiro do tipo seu componente

76
00:05:16,120 --> 00:05:17,020
‫de cápsula.

77
00:05:17,050 --> 00:05:22,060
‫Agora seu componente de cápsula está no arquivo de cabeçalho do componente de cápsula.

78
00:05:22,060 --> 00:05:28,470
‫Agora, na verdade, vamos usar esse tipo com base em quando construímos um objeto do U.

79
00:05:28,480 --> 00:05:30,010
‫Tipo de componente da cápsula.

80
00:05:30,010 --> 00:05:36,820
‫Então, com base em tudo o que realmente precisamos é ter um ponteiro do componente cápsula do tipo U.

81
00:05:37,000 --> 00:05:44,440
‫Agora, a verdade é baseada em H, na verdade, não precisa dos detalhes de implementação da classe de componentes da

82
00:05:44,440 --> 00:05:45,160
‫cápsula.

83
00:05:45,160 --> 00:05:50,680
‫Em outras palavras, ele não precisa saber como as funções são definidas ou mesmo quão grande é a classe do

84
00:05:50,680 --> 00:05:51,820
‫componente da cápsula.

85
00:05:51,850 --> 00:05:55,750
‫Um ponteiro de componente de cápsula é do mesmo tamanho que qualquer outro ponteiro.

86
00:05:55,750 --> 00:05:57,250
‫É apenas um endereço.

87
00:05:57,250 --> 00:05:58,810
‫Agora na classe do plano base.

88
00:05:58,810 --> 00:06:01,420
‫Queremos construir o componente cápsula.

89
00:06:01,510 --> 00:06:08,260
‫Por esse motivo, precisamos saber o tamanho de um componente de cápsula para dispor a memória necessária para

90
00:06:08,260 --> 00:06:09,790
‫criar esse objeto.

91
00:06:09,790 --> 00:06:16,330
‫Portanto, enquanto o cabeçalho do componente da cápsula não é estritamente necessário na base Ponca, é absolutamente necessário na base.

92
00:06:16,350 --> 00:06:24,970
‫Porkpie Então, uma boa prática de programação é incluir apenas cabeçalhos onde você realmente precisa deles para que possamos declarar um ponteiro

93
00:06:24,970 --> 00:06:32,410
‫do tipo U ponteiro de componente de cápsula no produto base H e, em seguida, incluir componentes de cápsula

94
00:06:32,410 --> 00:06:39,310
‫onde precisamos dos detalhes de implementação porque estamos construindo um componente de cápsula e precisamos saber o

95
00:06:39,310 --> 00:06:41,020
‫tamanho de a.

96
00:06:41,310 --> 00:06:43,230
‫Componente de cápsula na memória.

97
00:06:43,350 --> 00:06:49,920
‫Agora vamos discutir as consequências de incluir o arquivo de cabeçalho no base pond FX.

98
00:06:50,010 --> 00:06:55,410
‫Como vimos, podemos absolutamente fazer isso e você pode estar pensando, bem, estamos incluindo isso

99
00:06:55,410 --> 00:07:01,230
‫na base pont CP De qualquer forma, que diferença faz se incluí-lo em um arquivo versus outro?

100
00:07:01,260 --> 00:07:03,180
‫Agora é aqui que entra o problema.

101
00:07:03,210 --> 00:07:07,390
‫Os arquivos de cabeçalho são projetados para serem incluídos por outros arquivos.

102
00:07:07,410 --> 00:07:12,810
‫Então, digamos que temos o Base Pond H e incluímos componentes de cápsula nele.

103
00:07:12,810 --> 00:07:18,600
‫E, mais adiante, temos outra classe e teremos um ponteiro de base pond em alguma outra

104
00:07:18,600 --> 00:07:23,370
‫classe, assim como tínhamos um ponteiro de componente de cápsula no pod base.

105
00:07:23,400 --> 00:07:28,230
‫Agora, ao invés de passar pelo problema de declarar o ponteiro base do lago

106
00:07:28,230 --> 00:07:33,810
‫e alguma outra classe, vamos apenas declará-lo como normal e incluir o peão base em alguma outra classe.

107
00:07:34,680 --> 00:07:41,520
‫Portanto, agora o Base Pond H não inclui apenas o cabeçalho do componente da cápsula, o que resulta em mais código sendo copiado

108
00:07:41,520 --> 00:07:43,190
‫para esse arquivo de cabeçalho.

109
00:07:43,200 --> 00:07:47,820
‫Agora, alguma outra classe tem base, que inclui o componente de cápsula.

110
00:07:47,820 --> 00:07:55,470
‫Portanto, todo o conteúdo e os componentes da cápsula também estão dentro de alguma outra classe H e nem são

111
00:07:55,470 --> 00:07:56,400
‫necessários lá.

112
00:07:56,400 --> 00:08:01,910
‫Alguma outra classe que H só precisa saber sobre base em que não se importa com o componente da cápsula.

113
00:08:01,920 --> 00:08:07,920
‫Agora digamos que continuamos este padrão e criamos alguma outra classe chamada ainda outra classe e ainda outra classe

114
00:08:07,920 --> 00:08:13,680
‫pode precisar ter um ponteiro do tipo alguma outra classe agora em vez de declarar para frente.

115
00:08:13,680 --> 00:08:21,180
‫Apenas incluímos alguma outra classe H em outra classe H e agora dentro de outra classe H.

116
00:08:21,210 --> 00:08:27,840
‫Mesmo que nós nem precisemos do cabeçalho para o componente base pond ou cápsula H, nós o colocamos em

117
00:08:27,840 --> 00:08:32,730
‫outra classe porque alguma outra classe inclui esses arquivos de cabeçalho dentro dela.

118
00:08:32,730 --> 00:08:40,140
‫Portanto, temos cópias de todo o conteúdo dos componentes da cápsula e, com base em H, apenas preso aqui em

119
00:08:40,140 --> 00:08:46,620
‫outra classe, aumentando esse arquivo e aumentando os tempos de compilação, tudo porque não enviamos a declaração.

120
00:08:46,620 --> 00:08:52,440
‫Então, em vez disso, a melhor coisa a fazer é incluir arquivos de cabeçalho onde eles são realmente necessários.

121
00:08:52,440 --> 00:08:59,610
‫Portanto, se pegarmos os componentes da cápsula e incluí-los apenas com base no CPP, mais tarde, quando criarmos

122
00:08:59,610 --> 00:09:05,340
‫outra classe e realmente precisarmos usar o pod base, podemos incluir o cabeçalho lá

123
00:09:05,340 --> 00:09:12,840
‫e a base não inclui componentes da cápsula, então todo esse código extra não está incluído em alguma outra

124
00:09:12,840 --> 00:09:13,440
‫classe.

125
00:09:13,440 --> 00:09:18,810
‫E então quando vamos e criamos outra classe que precisa de alguma outra classe, podemos incluir alguma

126
00:09:18,810 --> 00:09:24,990
‫outra classe que h em outra classe que CPP onde é realmente necessário e então outra classe que H

127
00:09:24,990 --> 00:09:30,270
‫não é preenchida com o conteúdo de outros arquivos de cabeçalho que ele não precisa.

128
00:09:30,270 --> 00:09:36,990
‫Portanto, quando as classes têm dependências como essa com base no componente da cápsula, é melhor manter

129
00:09:36,990 --> 00:09:38,670
‫essas dependências no mínimo.

130
00:09:38,880 --> 00:09:42,570
‫Então vou desafiá-lo a criar um erro de compilação.

131
00:09:42,570 --> 00:09:44,970
‫Não devemos ter medo de erros de compilação.

132
00:09:44,970 --> 00:09:47,550
‫Eles são apenas uma parte normal do processo de desenvolvimento.

133
00:09:47,550 --> 00:09:54,210
‫Então, vamos gerar um intencionalmente voltar e remover a palavra-chave class e compilar sem

134
00:09:54,210 --> 00:09:56,160
‫declarar cápsula comp.

135
00:09:56,160 --> 00:10:04,080
‫Agora, quando digo compilar, quero dizer que você pode compilar a partir do código do Visual Studio, apenas uma compilação C++ normal.

136
00:10:04,110 --> 00:10:10,500
‫Você aprendeu como fazer isso ou pode simplesmente salvar seu arquivo e código do Visual Studio e iniciar a

137
00:10:10,500 --> 00:10:11,670
‫codificação ao vivo.

138
00:10:11,670 --> 00:10:16,800
‫Qualquer um deles está bem e, assim que passarmos por isso juntos, mostrarei o que acontece com os dois

139
00:10:16,800 --> 00:10:17,280
‫métodos.

140
00:10:17,280 --> 00:10:22,440
‫Se você usar a codificação ao vivo, é claro que verá a saída gerada na janela de

141
00:10:22,440 --> 00:10:27,270
‫codificação ao vivo, em oposição à saída que você veria no código do Visual Studio.

142
00:10:27,270 --> 00:10:33,060
‫Agora spoiler, você vai receber um erro de compilação, olhe para a mensagem de erro de compilação, veja o que

143
00:10:33,060 --> 00:10:34,260
‫está lhe dizendo.

144
00:10:34,470 --> 00:10:38,070
‫Isso é apenas nos familiarizarmos com os erros que geramos.

145
00:10:38,070 --> 00:10:43,500
‫Depois disso, volte e avance, declare cápsula comp usando a palavra-chave class.

146
00:10:43,620 --> 00:10:48,450
‫Depois de fazer isso, compile novamente, você deve obter uma compilação bem-sucedida desta vez.

147
00:10:48,780 --> 00:10:51,060
‫Pause o vídeo e experimente.

148
00:10:53,520 --> 00:10:56,350
‫Tudo bem, então vamos causar estragos em nosso código aqui.

149
00:10:56,370 --> 00:10:58,320
‫Vou remover a palavra-chave class.

150
00:10:58,700 --> 00:11:03,540
‫Ok, tentamos compilar e aqui está a saída no terminal.

151
00:11:03,570 --> 00:11:09,300
‫A primeira coisa que vemos é um erro e nos dá um código de erro e diz que a cápsula comp não é

152
00:11:09,300 --> 00:11:10,830
‫membro de um peão base.

153
00:11:10,860 --> 00:11:17,040
‫Temos uma nota que diz C declaração de um peão base e então vemos que temos outros erros como

154
00:11:17,040 --> 00:11:17,940
‫resultado disso.

155
00:11:17,940 --> 00:11:23,390
‫Então, muitas vezes os alunos ficam confusos quando tentam compilar e parecem vários erros.

156
00:11:23,400 --> 00:11:28,560
‫Isso mostra que um único erro pode propagar uma série de erros.

157
00:11:28,560 --> 00:11:31,670
‫E isso não significa que você precisa consertar um monte de arquivos.

158
00:11:31,680 --> 00:11:34,410
‫O erro pode ter uma única origem aqui.

159
00:11:34,410 --> 00:11:36,420
‫Sabemos qual é a origem do erro.

160
00:11:36,420 --> 00:11:37,820
‫Precisamos encaminhar declarar.

161
00:11:37,830 --> 00:11:45,150
‫Agora vamos ver o que acontece se usarmos codificação ao vivo em vez de compilação regular e código do Visual Studio.

162
00:11:45,150 --> 00:11:51,450
‫Então, vou em frente e clique no botão para iniciar a codificação ao vivo e imediatamente em vermelho vejo que a

163
00:11:51,450 --> 00:11:54,270
‫compilação falhou e vemos a mesma coisa aqui.

164
00:11:54,270 --> 00:11:55,050
‫Bem aqui.

165
00:11:55,050 --> 00:11:59,310
‫A composição da cápsula não é um membro de uma nota de peão base.

166
00:11:59,340 --> 00:12:01,860
‫Veja a declaração de um peão base.

167
00:12:01,860 --> 00:12:03,750
‫Então vemos a mesma coisa aqui.

168
00:12:03,750 --> 00:12:08,490
‫Então, em ambos os casos, veremos um erro como este quando esquecermos de encaminhar a declaração.

169
00:12:08,490 --> 00:12:16,170
‫Então agora sabemos como é e agora estamos mais informados e com menos medo dessas misteriosas mensagens de erro

170
00:12:16,170 --> 00:12:17,340
‫de compilação.

171
00:12:17,460 --> 00:12:23,280
‫Então, o que vamos fazer é corrigir esse erro, declarando seu componente cápsula e, em seguida,

172
00:12:23,280 --> 00:12:24,990
‫podemos tentar compilar novamente.

173
00:12:24,990 --> 00:12:27,780
‫E agora compilamos sem erros.

174
00:12:27,870 --> 00:12:32,070
‫Então agora vemos como é quando esquecemos de declarar uma variável.

175
00:12:32,100 --> 00:12:35,250
‫Tenha isso em mente quando você receber erros do compilador no futuro.

176
00:12:35,760 --> 00:12:41,490
‫Então, em resumo, discutimos a declaração de encaminhamento ao criar um novo ponteiro e aprendemos

177
00:12:41,490 --> 00:12:48,370
‫que você deve incluir apenas o que usa no arquivo CP e devemos incluir o mínimo possível no arquivo

178
00:12:48,450 --> 00:12:49,020
‫H.

179
00:12:49,050 --> 00:12:55,020
‫Sabemos que não precisamos do arquivo de cabeçalho para declarar um novo ponteiro desde que encaminhemos a declaração e

180
00:12:55,020 --> 00:13:00,090
‫que precisamos do arquivo de cabeçalho se formos construir um objeto de um tipo específico.

181
00:13:00,090 --> 00:13:05,850
‫E precisamos do arquivo de cabeçalho para acessar membros como funções e variáveis e vimos que realmente precisamos

182
00:13:05,850 --> 00:13:09,780
‫do arquivo de cabeçalho para herança para herança de uma classe.

183
00:13:09,780 --> 00:13:11,460
‫Precisamos desse arquivo de cabeçalho lá.

184
00:13:11,580 --> 00:13:17,160
‫Agora que sabemos como encaminhar um tipo e temos nossa composição de cápsula de ponteiro, estamos prontos

185
00:13:17,160 --> 00:13:21,840
‫para construir um objeto de componente de cápsula e faremos isso no próximo vídeo.

186
00:13:22,200 --> 00:13:23,040
‫Vejo você em breve.

