﻿1
00:00:04,350 --> 00:00:09,720
‫Bu derste, C++'da sanal yöntem hakkında konuşacağız.

2
00:00:09,720 --> 00:00:13,170
‫Daha önce gördük, kullandık ama tam olarak anladık mı?

3
00:00:13,170 --> 00:00:14,100
‫Bakalım.

4
00:00:14,100 --> 00:00:20,460
‫Yani sanal yöntem fikri, bir temel sınıftaki işlevleri geçersiz kılmamıza izin vermesidir.

5
00:00:20,460 --> 00:00:27,210
‫Bunu Unreal'da begin, play ve tic gibi şeylerde gördük, ancak bunu daha ayrıntılı inceleyelim ve neden sanal

6
00:00:27,210 --> 00:00:29,880
‫olarak işaretlendiklerini anlayalım.

7
00:00:29,880 --> 00:00:38,340
‫Bu temel sınıftaki işlevselliği değiştirmemize olanak tanır ve bunun gerçekte ne anlama geldiğini ve sanal yöntemlerin

8
00:00:38,340 --> 00:00:44,550
‫neden C++'da C Sharp gibi diğer birçok dilde olduğu gibi varsayılan işlevsellik olmadığını

9
00:00:44,550 --> 00:00:50,820
‫anlamak için birazdan bahsedeceğimiz Dinamik Gönderim adı verilen bir şey yapar.

10
00:00:50,820 --> 00:00:52,320
‫Şimdi şuna bir göz atalım.

11
00:00:52,440 --> 00:00:59,910
‫Bunu CPP dot S-H web sitesinde yapacağım, böylece burada Unreal'da hiç bulunmayacağız.

12
00:00:59,910 --> 00:01:05,160
‫Bu dil özelliğini ve nasıl çalıştığını anlayabilmeniz için sadece ham C++ işlevselliğine

13
00:01:05,160 --> 00:01:06,090
‫bakıyoruz.

14
00:01:06,150 --> 00:01:10,680
‫Şimdi, burada yapacağım ilk şey, devam etmek ve ana yöntemi temizlemek.

15
00:01:10,680 --> 00:01:18,120
‫Kullanım örneğimizde, silahlar için bir sınıf düşüneceğiz, çünkü bu oyunlar için çok yaygın bir

16
00:01:18,120 --> 00:01:19,680
‫kullanım alanıdır.

17
00:01:19,680 --> 00:01:26,760
‫Oldukça basit bir şekilde it gun adında bir sınıfa bakalım ve bu sınıfın gövdesinin public

18
00:01:26,760 --> 00:01:31,860
‫olmasını ve bir void shoot metodu olmasını sağlayalım.

19
00:01:32,520 --> 00:01:38,460
‫Ve işleri çok basit tutmak için bu çekim yönteminin gövdesini tam burada sırayla beyan

20
00:01:38,460 --> 00:01:39,310
‫edeceğim.

21
00:01:39,330 --> 00:01:44,550
‫Bu arada, bunu daha önce görmediyseniz yapabilirsiniz, ancak genel olarak konuşursak, işleri ayrı tutmak,

22
00:01:44,550 --> 00:01:49,770
‫derleme sürelerini daha hızlı hale getirmek vb. için işleri ayrı bir C++ dosyasında yapmak isteriz.

23
00:01:49,770 --> 00:01:55,290
‫Ancak burada sadece bir oyuncak örneği olduğu için bu iyi, bu yüzden bir STD C çıkışı yapacağız.

24
00:01:55,290 --> 00:02:03,390
‫Yani C++'ı çıktı dizesi olarak kullanacağız ve bu yöntemi çağırdığımızda temel olarak patlayacağız ve sonra satırı

25
00:02:03,390 --> 00:02:04,980
‫sonlandıracağız.

26
00:02:05,570 --> 00:02:07,850
‫Ve bu onların çekim yönteminin gövdesi.

27
00:02:07,850 --> 00:02:11,720
‫Ve sınıfı küme parantezi ve noktalı virgülle tamamlayabiliriz.

28
00:02:11,960 --> 00:02:14,750
‫Şimdi devam edelim ve bu sınıfı gerçekten kullanalım.

29
00:02:14,750 --> 00:02:23,510
‫main'de bir silahım değişkeni oluşturacağım ve silahıma nokta atışı diyeceğim ve burada her şeyin olması gerektiği gibi

30
00:02:23,510 --> 00:02:25,910
‫çalışıp çalışmadığını görelim.

31
00:02:25,940 --> 00:02:28,070
‫Çalıştır düğmesine bas ve bam.

32
00:02:28,160 --> 00:02:30,530
‫Beklediğimiz gibi yöntemi çağırıyor.

33
00:02:30,980 --> 00:02:39,470
‫Şimdi silahımı uzatmak ve belki bir tüfek veya tabanca yapmak istersem ne olur?

34
00:02:39,470 --> 00:02:40,420
‫Buna tabanca diyelim.

35
00:02:40,430 --> 00:02:47,180
‫Yani pistol sınıfı, gun sınıfından miras alınmıştır ve bu şekilde çalışır.

36
00:02:47,180 --> 00:02:51,530
‫Ve eğer bunu daha önce görmediyseniz, çünkü muhtemelen bunu daha önce yazmamışsınızdır, diğer

37
00:02:51,530 --> 00:02:56,330
‫sınıfların gun'dan miras aldığınızı görebilmesi için guns'dan public bir miras alırsınız.

38
00:02:56,600 --> 00:03:04,280
‫Ve sonra genel bölümde, tabanca için bu işlevi geçersiz kılan kendi ateş etme yöntemimizi oluşturmak

39
00:03:04,280 --> 00:03:05,540
‫istiyoruz.

40
00:03:05,540 --> 00:03:13,220
‫Ve burada sonunda patlama yazdırmak yerine hap yazdırmak istiyoruz çünkü bu daha küçük bir silah, daha küçük

41
00:03:13,220 --> 00:03:17,420
‫bir ses çıkarıyor ve bu da bizim ateş etme yöntemimiz.

42
00:03:17,420 --> 00:03:20,150
‫Dersi burada bitirelim.

43
00:03:20,360 --> 00:03:23,300
‫Ve yapmak istediğimiz şey kendimize bir tabanca yaratmak.

44
00:03:23,300 --> 00:03:28,010
‫Yani tabancamı buradaki ana yöntemle ateşleyin.

45
00:03:28,670 --> 00:03:34,010
‫Ve bunlar sadece burada, ana yöntemde mevcut olduğu için, onlara işaretçi kullanmıyoruz.

46
00:03:34,010 --> 00:03:38,450
‫Bu yüzden burada ok yerine atış operatörünü kullanıyoruz.

47
00:03:38,750 --> 00:03:42,260
‫Yani tabancam ateş etmiyor.

48
00:03:42,260 --> 00:03:43,460
‫Bakalım bu ne yapacak.

49
00:03:43,610 --> 00:03:47,280
‫PPU yazdırmasını bekleyeceğim, ki yazdırıyor.

50
00:03:47,300 --> 00:03:47,930
‫Güzel.

51
00:03:48,260 --> 00:03:51,530
‫Tamam, o zaman çağıran yöntemlerimizi kaldıralım.

52
00:03:51,530 --> 00:03:57,050
‫Doğrudan bunların üzerine ateş edin ve bir işaretçi ile işlerin nasıl davranacağını görelim.

53
00:03:57,290 --> 00:04:01,880
‫Bu yüzden Gun adında bir silah işaretçisi oluşturacağım.

54
00:04:02,660 --> 00:04:03,640
‫Peter.

55
00:04:04,570 --> 00:04:06,910
‫Ve bir sonraki satırda bunu aynı satırda yapabilirim.

56
00:04:06,910 --> 00:04:08,890
‫Ancak basitlik adına, bunu bir sonraki satırda yapacağım.

57
00:04:08,890 --> 00:04:15,790
‫Bu silah işaretçisini, operatörün adresi olan silahım değişkeninin adresini gösterecek

58
00:04:15,790 --> 00:04:18,310
‫şekilde ayarlayacağım.

59
00:04:18,580 --> 00:04:23,830
‫Ve sonra bu bir işaretçi olduğu için, shoot yöntemini çağırmak için ok operatörünü kullanmamız gerekir.

60
00:04:23,830 --> 00:04:30,400
‫Bu yüzden silahıma ateş et diyeceğim, çalıştır'a tıklayalım ve sonuç olarak patlama elde edelim.

61
00:04:30,400 --> 00:04:31,120
‫Güzel.

62
00:04:31,210 --> 00:04:34,450
‫Şimdi aynı şeyi ben yaparsam ne olur?

63
00:04:34,450 --> 00:04:40,840
‫Ancak silah işaretçisini tabancamı gösterecek şekilde ayarlamak yerine, tabancamı gösterecek şekilde ayarladım.

64
00:04:40,990 --> 00:04:42,550
‫Devam edelim ve şimdi koşalım.

65
00:04:42,880 --> 00:04:43,240
‫Tamam.

66
00:04:43,240 --> 00:04:45,190
‫Bu ilginç bir davranış.

67
00:04:45,190 --> 00:04:51,880
‫Burada olan şey, her iki durumda da bu ilk yöntemi çağırıyor olmasıdır.

68
00:04:51,880 --> 00:04:55,510
‫Peki bu ikinci çekim yöntemi neden çağrılmadı?

69
00:04:55,510 --> 00:04:58,030
‫Burada işaretçi olarak bir tabancamız var.

70
00:04:58,300 --> 00:05:05,500
‫Sanal bir yönteminiz yoksa, C++ varsayılan olarak işaretçinizin türünü kullanacaktır,

71
00:05:05,500 --> 00:05:07,960
‫ki bu bir gun işaretçisidir.

72
00:05:07,960 --> 00:05:11,890
‫Çağrılacak yöntemi bulmak için bu türü kullanacağını unutmayın.

73
00:05:11,890 --> 00:05:18,130
‫Böylece pistol'daki geçersiz kılınan yöntem yerine gidip en üstteki bu ateş etme yöntemini çağıracaktır.

74
00:05:18,130 --> 00:05:23,530
‫pistol'daki geçersiz kılınmış ve yöntemi çağırması için, pistol türünde bir göstericiye

75
00:05:23,530 --> 00:05:25,630
‫sahip olması gerekir.

76
00:05:25,960 --> 00:05:27,520
‫İşte bu iyi.

77
00:05:27,520 --> 00:05:29,350
‫Ve bunu neden yaptıklarını anlayabilirsiniz.

78
00:05:29,350 --> 00:05:30,430
‫Verimlilik için.

79
00:05:30,430 --> 00:05:32,410
‫C++ tamamen verimlilikle ilgilidir.

80
00:05:32,410 --> 00:05:39,250
‫Eğer bir şey derlendiğinde ya da çalıştığında daha pahalıya mal olacaksa, siz istemediğiniz sürece C++ bunu varsayılan

81
00:05:39,250 --> 00:05:40,600
‫olarak yapmayacaktır.

82
00:05:40,630 --> 00:05:46,270
‫Bu nedenle, C++'ın araması ve "Bu bir silah işaretçisi, bu yüzden bu silah işaretçisi yöntemini çağıracağım"

83
00:05:46,270 --> 00:05:47,620
‫demesi çok kolaydır.

84
00:05:47,620 --> 00:05:50,080
‫İşte bu noktada Dinamik Sevkiyat devreye giriyor.

85
00:05:50,080 --> 00:05:54,070
‫Bu süslü terim temelde bunu yapmasını istemediğimiz anlamına gelir.

86
00:05:54,070 --> 00:05:59,950
‫Yapmasını istediğimiz şey, "Bir saniye, bu silah işaretçisinde aslında ne saklanıyor?" demek.

87
00:05:59,950 --> 00:06:02,140
‫Oradaki gerçek tip nedir?

88
00:06:02,380 --> 00:06:06,250
‫Ve fark ettiğimiz gerçek tip, bunun bir tabanca tipi olduğudur.

89
00:06:06,250 --> 00:06:12,520
‫Bu yüzden kendimize şu soruyu sormalıyız: Bu tür için geçersiz kılınan bir yöntem var mı?

90
00:06:12,520 --> 00:06:13,600
‫Ve evet, var.

91
00:06:13,600 --> 00:06:20,230
‫Peki, C++'a biraz daha az verimli olma iznini nasıl verebiliriz ve bu işaretçi türünü değiştirmek zorunda kalmadan

92
00:06:20,230 --> 00:06:26,110
‫geçersiz kılma yeteneğini bize nasıl verebiliriz, ki bu her zaman mümkün olmayabilir.

93
00:06:26,110 --> 00:06:31,690
‫Aslında, kendi özel aktör sınıfınız olduğunda olduğu gibi, birçok durumda bu mümkün

94
00:06:31,690 --> 00:06:32,470
‫değildir.

95
00:06:32,590 --> 00:06:38,290
‫Unreal, her yeni sınıf eklediğinizde tüm motoru değiştirmelerini gerektirecek özel hareket sınıfınıza

96
00:06:38,290 --> 00:06:41,290
‫işaret edecek bir işaretçiye sahip değildir.

97
00:06:41,290 --> 00:06:43,120
‫Hayır, bu mümkün değil.

98
00:06:43,120 --> 00:06:46,360
‫Aktör yıldız türünde bir şeye işaret ediyorlar.

99
00:06:46,360 --> 00:06:51,010
‫Yani oyuna başla dedikleri zaman, oyuna başlama yönteminizi çağırmasını istersiniz.

100
00:06:51,010 --> 00:06:52,630
‫Yani sanal olmak zorunda.

101
00:06:52,630 --> 00:06:54,340
‫Ve buradaki kilit nokta da budur.

102
00:06:54,340 --> 00:07:02,500
‫Ana sınıftaki yöntemin önüne virtual eklersek, bu artık C++'a bir saniye bekleyin, eğer silah göstericisi

103
00:07:02,500 --> 00:07:10,120
‫türünde bir göstericiye ateş et diyorsam, bunun örneğin bir tabanca olmadığını ve bu ateş et yönteminin

104
00:07:10,120 --> 00:07:14,350
‫geçersiz kılındığını kontrol etmem gerekir.

105
00:07:14,350 --> 00:07:19,390
‫Şimdi devam edip çalıştır düğmesine basarsak, patlama ve ardından hap elde ettiğimizi görebilirsiniz.

106
00:07:19,420 --> 00:07:24,070
‫Yani Dinamik Sevkiyat ile beklediğimiz gibi çalışıyor.

107
00:07:24,070 --> 00:07:30,370
‫Ve bu, temelde sadece işaretçide gerçekten ne tür bir tipin tutulduğunu kontrol etmek ve ilgili yöntemi çağırmak

108
00:07:30,370 --> 00:07:33,430
‫anlamına gelen bu şey için kullanılan terimdir.

109
00:07:33,940 --> 00:07:40,450
‫Şimdi, sıklıkla kullanıldığını göreceğiniz fazladan küçük bir sözdizimi vardır ve bu da override anahtar sözcüğüdür.

110
00:07:40,450 --> 00:07:45,520
‫Ve bunu sanal olarak geçersiz kılmaya çalıştığınız bir yöntemden sonra koyarsınız.

111
00:07:45,790 --> 00:07:53,680
‫Ve temel olarak geçersiz kılma anahtar sözcüğü kesinlikle gerekli değildir, ayrıca bir silahın alt sınıfındaki bir şeye karşı sanal

112
00:07:53,680 --> 00:07:56,200
‫tekrar koymak da gerekli değildir.

113
00:07:56,200 --> 00:07:59,350
‫Yani sanal koymak zorunda değilsiniz, ama bunu yapmaktan zarar gelmez.

114
00:07:59,560 --> 00:08:07,030
‫Ancak geçersiz kılma özellikle yararlıdır çünkü isimlendirmemizi doğru yaptığımızdan emin olmamızı sağlar.

115
00:08:07,030 --> 00:08:10,690
‫Yani çalıştır düğmesine basarsam, geçersiz kılma olduğunda her şey eskisi gibi çalışıyor.

116
00:08:10,690 --> 00:08:17,290
‫Ancak bu yöntemin adını yanlışlıkla yanlış anladığımı ve bu yüzden geçersiz kılma işlemini yapmadığımı varsayalım.

117
00:08:17,290 --> 00:08:19,490
‫Ve ben buna çekim yok demiştim.

118
00:08:19,870 --> 00:08:22,750
‫Örneğin, ismi yanlış kopyalamışım.

119
00:08:22,750 --> 00:08:24,520
‫Kopyalamak yerine yazdım.

120
00:08:24,520 --> 00:08:29,230
‫Şimdi çalıştır düğmesine basarsam, görüyorsunuz, yine aynı hatayı alıyoruz çünkü ateş etmeye çağırmaya çalışıyoruz.

121
00:08:29,230 --> 00:08:32,350
‫Bunu yanlışlıkla geçersiz kıldık.

122
00:08:32,350 --> 00:08:33,820
‫Bam, bam.

123
00:08:33,910 --> 00:08:37,840
‫Yani bundan kaçınmanın yolu, "Bir şeyi geçersiz kılmaya çalışıyorum" demek.

124
00:08:37,840 --> 00:08:44,170
‫Bu yüzden override anahtar sözcüğümü buraya koydum ve şimdi derlemeye çalışırsam, shooter'ın override olarak işaretlendiğini

125
00:08:44,170 --> 00:08:50,260
‫söylediğini görebilirsiniz, ancak override edebileceğim bir yöntem, sanal bir yöntem yok, bu durumda, Oh evet, bunu

126
00:08:50,260 --> 00:08:52,360
‫yanlış yazmışım diyebilirim.

127
00:08:52,360 --> 00:08:57,340
‫Bu yüzden devam edip kodumu düzelteceğim ve tekrar çekim yapacağım.

128
00:08:57,340 --> 00:08:59,320
‫Ve şimdi istediğim gibi çalışıyor.

129
00:08:59,320 --> 00:09:04,150
‫Dolayısıyla, bu geçersiz kılmayı oraya koyarak ve anında bunu yaparak sadece biraz ekstra güvenlik sağlar.

130
00:09:04,240 --> 00:09:09,170
‫Ayrıca, geçersiz kılmaya çalıştığımız şeyin sanal olmaması durumuna karşı da bizi korur.

131
00:09:09,190 --> 00:09:14,680
‫Bunu yapmayı denediğimde, geçersiz kılma olarak işaretlendiğini söylediğini görebilirsiniz,

132
00:09:14,680 --> 00:09:19,410
‫ancak geçersiz kılmaz çünkü bu üst sınıfın shoot için sanal bir işlevi yoktur.

133
00:09:19,420 --> 00:09:25,570
‫Umarım bu size C++'ın sanal fonksiyonları nasıl kullandığı ve uyguladığı ve neden onlar hakkında bu kadar açık olmamız gerektiği

134
00:09:25,570 --> 00:09:28,330
‫hakkında genel bir bakış açısı kazandırmıştır.

135
00:09:28,600 --> 00:09:32,890
‫Şimdi genel olarak sanal fonksiyonlar için bazı kullanım durumlarını düşünelim.

136
00:09:32,890 --> 00:09:34,750
‫Motordan bazılarını zaten gördük.

137
00:09:34,750 --> 00:09:37,630
‫Sanalın daha önce nerede kullanıldığını gördünüz?

138
00:09:38,450 --> 00:09:40,190
‫Nerede kullandığınızı hayal edebiliyor musunuz?

139
00:09:40,220 --> 00:09:45,110
‫Az önce bir silahınız ve bunun farklı şekillerde ateş eden farklı geçersiz kılmalarının olabileceği

140
00:09:45,110 --> 00:09:46,880
‫bir kullanım örneği gördük.

141
00:09:47,300 --> 00:09:53,630
‫Bu iki soruya bir yanıt düşündüğünüzde, üst sınıflardaki işlevselliği geçersiz kılan sanal işlevleri kullanmayı

142
00:09:53,630 --> 00:09:55,530
‫başka nasıl hayal edebilirsiniz?

143
00:09:55,550 --> 00:10:01,290
‫Gidin ve bu dersteki tartışmaların bağlantısını takip edin ve cevabınızı oraya gönderin.

144
00:10:01,310 --> 00:10:06,010
‫Kullanım durumları ve bunları daha önce kullandığınız yerler ve diğer insanların neler bulduğunu görün.

145
00:10:06,020 --> 00:10:11,250
‫Belki bu, sanal yöntemler konusundaki anlayışınızı sağlamlaştırmanıza yardımcı olur.

146
00:10:11,270 --> 00:10:12,280
‫Bu ders için bu kadar.

147
00:10:12,290 --> 00:10:15,710
‫Sanal yöntemleri öfkeyle kullanacağımız bir sonraki bölümde görüşmek üzere.

