‫เราจึงรู้ว่าเราต้องการส่วนประกอบบางอย่างบนฐาน -- คลาสของเรา
‫เรารู้ว่าเราต้องการตาข่ายฐานสำหรับส่วนล่างของถังและป้อมปืน
‫เราต้องการตาข่ายป้อมปืนสำหรับส่วนบนด้วย
‫เราจำเป็นต้องมีแคปซูลเพื่อรับมือกับการชนกัน และเราต้องการจุดวางไข่ของโพรเจกไทล์
‫นั่นจะเป็นองค์ประกอบฉาก
‫เมื่อเราเพิ่มสิ่งเหล่านี้ลงในคลาสพ็อดพื้นฐานแล้ว อะไรก็ตามที่เราสร้างโดยอิงจากคลาสนี้จะสืบทอดสิ่งเหล่านั้น
‫ดังนั้นเราจึงสามารถสร้างรถถังตามฐาน -- จากนั้นเราก็ไปสร้างหอคอยตามฐานด้วย
‫--
‫และเนื่องจากพวกมันอยู่บนพื้นฐานของพ็อดฐาน พวกเขาจึงสืบทอดส่วนประกอบเหล่านี้
‫รถถังสามารถมีตาข่ายฐาน ตาข่ายป้อมปืน แคปซูลของตัวเอง และจุดวางไข่ของกระสุนปืน
‫และในทำนองเดียวกัน หอคอยจะได้รับส่วนประกอบแคปซูลตาข่ายป้อมปืนฐานและจุดวางไข่ของโพรเจกไทล์เช่นกัน
‫และในไม่ช้าเราจะเห็นวิธีที่เราสามารถกำหนดตาข่ายต่างๆ ให้กับแต่ละตาข่ายเพื่อให้ดูแตกต่างกัน
‫ดังนั้นเราจึงรู้ว่าเราต้องการส่วนประกอบบางอย่าง
‫ตอนนี้ได้เวลาเพิ่มส่วนประกอบบางอย่างลงในคลาสพื้นฐานของเราแล้ว
‫ตามค่าเริ่มต้นแล้ว เรามีส่วนสาธารณะ ส่วนที่ได้รับการคุ้มครอง และส่วนสาธารณะส่วนที่สองอยู่ที่นี่แล้ว
‫มีหลายสาเหตุที่ต้องมีส่วนสาธารณะหลายส่วน และเราจะพูดถึงส่วนเหล่านั้นในภายหลัง
‫แต่สำหรับคอมโพเนนต์ของเรา เราจะสร้างส่วนส่วนตัว
‫ดังที่คุณได้เรียนรู้ไปก่อนหน้านี้ เป็นการดีที่จะมีตัวแปรของสมาชิกเป็นแบบส่วนตัว เพื่อให้สามารถเข้าถึงได้จากภายในชั้นเรียนที่เป็นเจ้าของเท่านั้น
‫ดังนั้นเราจึงต้องการส่วนประกอบบางอย่าง
‫อันแรกที่ฉันจะเพิ่มคือแคปซูล
‫มาสร้างตัวแปรประเภทส่วนประกอบแคปซูลกันเถอะ
‫ทีนี้ นี่จะเป็นตัวชี้
‫เราจะใช้พอยน์เตอร์สำหรับตัวแปรส่วนใหญ่ตราบใดที่ไม่ใช่ประเภทฐาน เช่น
‫จำนวนเต็มหรือทศนิยม
‫และอย่างที่คุณทราบ นั่นเป็นเพราะว่าพอยน์เตอร์มีขนาดเล็ก พวกมันเป็นเพียงแอดเดรส และช่วยให้เรามีประสิทธิภาพมากขึ้น
‫เรามีตัวชี้ส่วนประกอบแคปซูล U และเราจะเรียกชื่อย่อของแคปซูลนี้ว่าส่วนประกอบแคปซูล
‫ตอนนี้ เหนือองค์ประกอบแคปซูล เราจะเพิ่มมาโครเฉพาะเครื่องยนต์ที่ไม่จริง และมันเป็นคุณสมบัติของคุณในแคปทั้งหมดที่มีวงเล็บของมันเอง
‫คุณสมบัติของคุณเป็นวิธีหนึ่งในการทำให้ Unreal Engine รับรู้ถึงตัวแปรนี้ เพื่อให้สามารถเข้าร่วมใน Unreal Engine
‫ได้
‫ระบบสะท้อนแสง.
‫ระบบสะท้อนกลับช่วยให้เราสามารถทำสิ่งต่างๆ เช่น เปิดเผยตัวแปรนี้ต่อพิมพ์เขียว และมีส่วนร่วมในการรวบรวมขยะและสิ่งต่างๆ
‫เช่นนั้น
‫ดังนั้นการเพิ่มคุณสมบัติ you จะเป็นสิ่งที่จะเพิ่มให้กับส่วนประกอบของเราเมื่อเราสร้างมันขึ้นมา
‫ดังนั้นเราจึงมีส่วนประกอบแคปซูลนี้ และเนื่องจากเรากำลังใช้ส่วนประกอบแคปซูล YOU เราจึงต้องแจ้งให้คอมไพเลอร์ทราบเกี่ยวกับประเภทนี้
‫ไม่ทราบโดยปริยายว่าส่วนประกอบของแคปซูลคืออะไร
‫ปกติแล้วจะบอกคอมไพเลอร์ว่าส่วนประกอบแคปซูลคืออะไร เราจะรวมไฟล์ส่วนหัวไว้ด้านบนนี้พร้อมกับคำสั่งรวมของเรา
‫หากเราไปที่เอกสารประกอบเครื่องยนต์ที่ไม่จริงและค้นหาส่วนประกอบแคปซูลของคุณ
‫เราจะเห็นได้จากที่ที่มันบอก รวมไฟล์ส่วนหัวที่เราจะต้องรวมไว้เพื่อบอกคอมไพเลอร์เกี่ยวกับส่วนประกอบแคปซูล
‫ตอนนี้เราสามารถรวมนี่ไว้ตรงนี้ที่ด้านบนแล้วตามด้วย U ของเรา
‫คอมไพเลอร์จะรู้จักประเภทส่วนประกอบแคปซูลและทุกอย่างจะดูน่าเบื่อ
‫แต่โดยทั่วไป แนวปฏิบัติที่ดีในการเขียนโค้ดสิ่งเหล่านี้คือพยายามทำให้ไฟล์ส่วนหัวนี้มีขนาดเล็กที่สุด
‫เมื่อใดก็ตามที่เรารวมไฟล์ส่วนหัวในไฟล์นี้ โปรแกรมที่เรียกว่าตัวประมวลผลล่วงหน้าจะนำเนื้อหาทั้งหมดของไฟล์ส่วนหัวนั้น
‫แยกข้อมูลบางอย่าง เช่น ความคิดเห็น จากนั้นจึงวางเนื้อหาทั้งหมดของไฟล์ส่วนหัวนั้นลงในไฟล์นี้
‫ผลที่ได้คือไฟล์นี้มีขนาดใหญ่ขึ้นเพราะมีเนื้อหาของไฟล์ที่รวมอยู่นั้นมาวางที่นี่
‫เราต้องการรวมสิ่งต่าง ๆ เมื่อเราใช้งานเท่านั้น
‫แล้วเราจะหนีโดยไม่รวมไฟล์ส่วนหัวที่นี่ในฐาน -- ส่วนหัวได้อย่างไร
‫เราสามารถใช้บางสิ่งใน C++ ที่เรียกว่า Forward declaration
‫เราส่งต่อประกาศประเภทส่วนประกอบแคปซูล u โดยใช้คีย์เวิร์ดคลาสเช่นนี้
‫โปรดสังเกตว่าตอนนี้คอมไพเลอร์แสดงประเภทนี้เป็นสีเขียวเมื่อใดก็ตามที่เราส่งต่อประกาศตัวแปร จากนั้นจะหนีไปได้โดยไม่รวมไฟล์ส่วนหัว
‫มันกำลังบอกคอมไพเลอร์ว่านี่เป็นประเภท ดังนั้นมันจะไม่ให้ข้อผิดพลาด IntelliSense แก่เราอีกต่อไป โดยบอกว่าไม่รู้จักสิ่งนี้ว่าเป็นประเภท
‫ตอนนี้เป็นประเภทที่ไม่สมบูรณ์
‫หากเราพยายามใช้ประเภทนี้จริง ๆ โดยการเข้าถึงสมาชิก เช่น ฟังก์ชันและตัวแปร หรือพยายามสร้างวัตถุประเภทนี้
‫เราจะได้รับข้อผิดพลาดเนื่องจากเป็นประเภทที่ไม่สมบูรณ์
‫เราจะต้องมีไฟล์ส่วนหัวรวมอยู่ด้วยทุกที่ที่เราใช้ประเภทนี้เพื่อทำสิ่งเหล่านั้น เพื่อให้เราสามารถส่งต่อประกาศตัวชี้ประเภทเพื่อหลีกเลี่ยงการใช้ไฟล์ส่วนหัว
‫แต่สิ่งสำคัญคือต้องทราบว่าเราต้องการไฟล์ส่วนหัวเพื่อสืบทอดจากคลาสใดคลาสหนึ่ง
‫สังเกตว่าคลาสนี้สืบทอดมาจากบ่อและไฟล์ส่วนหัวของบ่อรวมอยู่ที่ด้านบนนี้
‫ดังนั้นการสืบทอดจึงต้องการไฟล์ส่วนหัวสำหรับประเภทที่เราได้รับ
‫เรามาคุยกันเรื่อง Forward Declaration และเหตุผลที่เราต้องการจะทำ
‫สมมติว่าเรามีคลาสที่เรียกว่า Base Pon ซึ่งจำเป็นต้องมีตัวแปรตัวชี้ประเภทส่วนประกอบแคปซูลของคุณ
‫ตอนนี้ส่วนประกอบแคปซูลของคุณอยู่ในไฟล์ส่วนหัวของส่วนประกอบแคปซูล
‫ตอนนี้เรากำลังจะใช้ประเภทนี้โดยพิจารณาจากเวลาที่เราสร้างวัตถุของ U
‫ชนิดส่วนประกอบแคปซูล
‫ดังนั้นโดยพื้นฐานแล้วเราต้องการเพียงตัวชี้ของส่วนประกอบแคปซูลประเภท U
‫ตอนนี้ความจริงอิงจาก H ไม่ต้องการรายละเอียดการใช้งานของคลาสส่วนประกอบแคปซูล
‫กล่าวอีกนัยหนึ่ง ไม่จำเป็นต้องรู้ว่าฟังก์ชันถูกกำหนดอย่างไร หรือแม้แต่คลาสส่วนประกอบแคปซูลใหญ่เพียงใด
‫ตัวชี้ส่วนประกอบแคปซูลมีขนาดเดียวกับตัวชี้อื่นๆ
‫มันเป็นแค่ที่อยู่
‫ตอนนี้อยู่ในคลาสแผนพื้นฐาน
‫เราต้องการสร้างส่วนประกอบแคปซูล
‫ด้วยเหตุนี้ เราจึงจำเป็นต้องทราบขนาดของส่วนประกอบแคปซูลเพื่อจัดวางหน่วยความจำที่จำเป็นสำหรับการสร้างวัตถุนี้
‫ดังนั้นในขณะที่ส่วนหัวของส่วนประกอบแคปซูลไม่จำเป็นในฐาน Ponca อย่างเคร่งครัด แต่จำเป็นอย่างยิ่งในฐาน
‫แนวทางปฏิบัติในการเขียนโปรแกรมที่ดีของ Porkpie คือการรวมส่วนหัวที่คุณต้องการจริงๆ เท่านั้น เพื่อที่เราจะสามารถหลีกเลี่ยงโดยการประกาศตัวชี้ของตัวชี้ส่วนประกอบแคปซูลประเภท
‫U ในผลิตภัณฑ์หลัก H แล้วรวมส่วนประกอบแคปซูลที่เราต้องการรายละเอียดการใช้งานเพราะเรากำลังสร้าง ส่วนประกอบของแคปซูลและเราจำเป็นต้องรู้ขนาดของ a.
‫ส่วนประกอบแคปซูลในหน่วยความจำ
‫ตอนนี้ เรามาพูดถึงผลที่ตามมาของการรวมไฟล์ส่วนหัวใน base pond FX แทน
‫ดังที่เราได้เห็น เราทำสิ่งนี้ได้อย่างแน่นอน และคุณอาจกำลังคิดว่า เรารวมมันไว้ใน pont pont
‫CP อยู่แล้ว แล้วมันจะสร้างความแตกต่างอย่างไรหากเรารวมมันไว้ในไฟล์หนึ่งกับอีกไฟล์หนึ่ง?
‫นี่คือที่มาของปัญหา
‫ไฟล์ส่วนหัวได้รับการออกแบบให้รวมไว้ในไฟล์อื่น
‫สมมติว่าเรามี Base Pond H และเราได้รวมส่วนประกอบของแคปซูลเข้าไปด้วย
‫แล้วต่อไปตามถนน เรามีคลาสอื่น ๆ และเราจะมีพอยน์เตอร์บ่อฐานในคลาสอื่น
‫ๆ เหมือนกับที่เรามีพอยน์เตอร์ส่วนประกอบแคปซูลในเบสพอด
‫ตอนนี้ แทนที่จะต้องผ่านปัญหาในการส่งต่อตัวชี้บ่อฐานและคลาสอื่นๆ
‫เราแค่จะประกาศให้เป็นปกติและรวมจำนำพื้นฐานในคลาสอื่นด้วย
‫ดังนั้นตอนนี้ Base Pond H ไม่เพียงแต่รวมส่วนหัวของส่วนประกอบแคปซูล ซึ่งส่งผลให้มีการคัดลอกโค้ดเพิ่มเติมลงในไฟล์ส่วนหัวนั้น
‫ขณะนี้มีคลาสอื่น ๆ ซึ่งรวมถึงส่วนประกอบแคปซูล
‫ดังนั้นเนื้อหาและส่วนประกอบของแคปซูลทั้งหมดจึงอยู่ในคลาส H อื่น ๆ และไม่จำเป็นแม้แต่น้อย
‫คลาสอื่นๆ ที่ H ต้องการทราบเกี่ยวกับพื้นฐานเท่านั้น โดยไม่สนใจส่วนประกอบแคปซูล
‫สมมติว่าเราดำเนินรูปแบบนี้ต่อไปและสร้างคลาสอื่นที่เรียกว่าคลาสอื่น และคลาสอื่นอาจจำเป็นต้องมีตัวชี้ประเภทบางคลาสในตอนนี้แทนที่จะประกาศไปข้างหน้า
‫เราแค่รวมคลาส H อื่นๆ ไว้ในคลาส H อีกคลาส และตอนนี้รวมอยู่ในคลาส H อีกคลาสหนึ่ง
‫แม้ว่าเราจะไม่ต้องการส่วนหัวสำหรับส่วนประกอบในบ่อฐานหรือส่วนประกอบแคปซูล H เราก็ได้มันในคลาสอื่นเพราะคลาสอื่นมีไฟล์ส่วนหัวเหล่านั้นอยู่ภายใน
‫ดังนั้นเราจึงมีสำเนาของเนื้อหาทั้งหมดของส่วนประกอบแคปซูลและอิงตาม H เพิ่งติดอยู่ที่นี่ในอีกคลาสหนึ่ง
‫ทำให้ไฟล์นั้นบวมและเพิ่มเวลารวบรวมทั้งหมดเพราะเราไม่ได้ส่งต่อประกาศ
‫ดังนั้นสิ่งที่ดีกว่าที่ต้องทำคือรวมไฟล์ส่วนหัวไว้ในที่ที่จำเป็นจริงๆ
‫ดังนั้น หากเราใช้ส่วนประกอบแคปซูลและรวมไว้โดยอิงตาม CPP เท่านั้น เมื่อเราสร้างคลาสอื่นและจำเป็นต้องใช้พ็อดฐานจริงๆ
‫เราสามารถรวมส่วนหัวที่นั่นและฐานตาม ไม่รวมส่วนประกอบแคปซูล ดังนั้นรหัสพิเศษทั้งหมดจึงไม่รวมอยู่ในชั้นเรียนอื่น
‫แล้วเมื่อเราไปสร้างอีกคลาสหนึ่งที่ต้องการคลาสอื่น เราสามารถรวมคลาสอื่นที่
‫h อยู่ในอีกคลาสหนึ่งที่ CPP ที่จำเป็นจริงๆ และอีกคลาสที่ H ไม่ได้เต็มไปด้วยเนื้อหาของ
‫ไฟล์ส่วนหัวอื่น ๆ ที่ไม่ต้องการ
‫ดังนั้นเมื่อคลาสมีการขึ้นต่อกันเช่นนี้ขึ้นอยู่กับการขึ้นกับส่วนประกอบแคปซูล เป็นการดีที่สุดที่จะรักษาการขึ้นต่อกันเหล่านั้นให้น้อยที่สุด
‫ฉันจะขอท้าให้คุณสร้างข้อผิดพลาดในการคอมไพล์
‫เราไม่ควรกลัวข้อผิดพลาดในการรวบรวม
‫สิ่งเหล่านี้เป็นเพียงส่วนหนึ่งของกระบวนการพัฒนา
‫ดังนั้นเราจะสร้างมันขึ้นมาโดยตั้งใจที่จะย้อนกลับไปและลบ class คำหลักและคอมไพล์โดยไม่ต้องส่งต่อแคปซูลคอมพ์
‫เมื่อฉันพูดว่าคอมไพล์ ฉันหมายความว่าคุณสามารถคอมไพล์จากโค้ด Visual Studio เพียงแค่คอมไพล์ C++ ปกติ
‫คุณได้เรียนรู้วิธีดำเนินการดังกล่าวแล้ว หรือเพียงแค่บันทึกไฟล์และโค้ด Visual Studio แล้วเริ่มเขียนโค้ดแบบสด
‫วิธีใดวิธีหนึ่งก็ใช้ได้ และเมื่อเราดำเนินการร่วมกันแล้ว ฉันจะแสดงให้คุณเห็นว่าเกิดอะไรขึ้นกับทั้งสองวิธี
‫หากคุณใช้ live coding แน่นอนว่าคุณจะต้องดูผลลัพธ์ที่สร้างขึ้นในหน้าต่าง
‫live coding แทนที่จะเป็นเอาต์พุตที่คุณจะเห็นในโค้ด Visual Studio
‫ตอนนี้สปอยเลอร์ คุณจะได้รับข้อผิดพลาดในการคอมไพล์ ดูข้อความแสดงข้อผิดพลาดในการรวบรวม ดูว่ามันบอกคุณว่าอะไร
‫นี่เป็นเพียงการทำความคุ้นเคยกับข้อผิดพลาดที่เราสร้างขึ้น
‫หลังจากนี้ ย้อนกลับไปข้างหน้า ประกาศแคปซูลคอมพ์โดยใช้คีย์เวิร์ดคลาส
‫เมื่อคุณทำเสร็จแล้ว ให้คอมไพล์อีกครั้ง คุณควรได้รับการคอมไพล์สำเร็จในครั้งนี้
‫หยุดวิดีโอชั่วคราวแล้วลองทำดู
‫เอาล่ะ มาทำลายโค้ดของเรากันที่นี่
‫ฉันจะลบคำหลักของชั้นเรียน
‫โอเค เราพยายามคอมไพล์แล้ว และนี่คือผลลัพธ์ในเทอร์มินัล
‫สิ่งแรกที่เราเห็นคือข้อผิดพลาด และมันให้รหัสข้อผิดพลาดแก่เรา และมันบอกว่าแคปซูลคอมพ์ไม่ใช่สมาชิกของฐานจำนำ
‫เรามีข้อความแจ้งว่า C ประกาศการจำนำพื้นฐาน และเราเห็นว่าเราได้รับข้อผิดพลาดอื่นๆ อันเป็นผลมาจากสิ่งนี้
‫บ่อยครั้งที่นักเรียนจะสับสนเมื่อพยายามรวบรวมและดูเหมือนมีข้อผิดพลาดหลายอย่าง
‫ดังนั้น นี่จึงแสดงให้เห็นว่าความผิดพลาดเพียงครั้งเดียวสามารถแพร่กระจายชุดของข้อผิดพลาดได้
‫และนั่นไม่ได้หมายความว่าคุณต้องไปแก้ไขไฟล์จำนวนมาก
‫ข้อผิดพลาดอาจมีต้นกำเนิดเดียวที่นี่
‫เรารู้ว่าสาเหตุของข้อผิดพลาดคืออะไร
‫เราจำเป็นต้องส่งต่อประกาศ
‫ตอนนี้เรามาดูกันว่าจะเกิดอะไรขึ้นถ้าเราใช้ live coding แทนการคอมไพล์ปกติและโค้ด Visual Studio
‫ดังนั้นฉันจะไปข้างหน้าและคลิกปุ่มเพื่อเริ่มต้นการเขียนโค้ดแบบสด และในทันทีที่เป็นสีแดง ฉันเห็นการบิลด์ล้มเหลว
‫และเราเห็นสิ่งเดียวกันที่นี่
‫ที่นี่.
‫แคปซูลคอมพ์ไม่ใช่สมาชิกของฐานจำนำ
‫ดูประกาศฐานจำนำ
‫ดังนั้นเราจึงเห็นสิ่งเดียวกันที่นี่
‫ดังนั้นไม่ว่ากรณีใดเราจะเห็นข้อผิดพลาดเช่นนี้เมื่อเราลืมส่งต่อการประกาศ
‫ตอนนี้เรารู้แล้วว่าหน้าตาเป็นอย่างไร และตอนนี้เราก็ได้รับข้อมูลมากขึ้นและกลัวข้อความแสดงข้อผิดพลาดในการคอมไพล์ลึกลับเหล่านี้น้อยลง
‫สิ่งที่เราจะทำคือแก้ไขข้อผิดพลาดนี้โดย Forward ประกาศส่วนประกอบแคปซูลของคุณ จากนั้นเราจะพยายามคอมไพล์อีกครั้ง
‫และตอนนี้เราได้รวบรวมโดยไม่มีข้อผิดพลาดใดๆ
‫ตอนนี้เรามาดูกันว่าเมื่อเราลืม Forward ประกาศตัวแปรจะเป็นอย่างไร
‫จำไว้ว่าเมื่อคุณได้รับข้อผิดพลาดของคอมไพเลอร์ในอนาคต
‫โดยสรุป เราได้หารือเกี่ยวกับการประกาศไปข้างหน้าเมื่อสร้างตัวชี้ใหม่ และเราได้เรียนรู้ว่าคุณควรรวมเฉพาะสิ่งที่คุณใช้ในไฟล์
‫CP และเราควรรวมไว้ในไฟล์ H ให้น้อยที่สุด
‫เรารู้ว่าเราไม่ต้องการไฟล์ส่วนหัวเพื่อประกาศตัวชี้ใหม่ตราบใดที่เราประกาศไปข้างหน้าและเราจำเป็นต้องมีไฟล์ส่วนหัวหากเราจะสร้างวัตถุประเภทใดประเภทหนึ่ง
‫และเราต้องการไฟล์ส่วนหัวเพื่อเข้าถึงสมาชิกเช่นฟังก์ชันและตัวแปร และเราเห็นว่าเราต้องการไฟล์ส่วนหัวสำหรับการสืบทอดสำหรับการสืบทอดจากคลาส
‫เราต้องการไฟล์ส่วนหัวที่นั่น
‫ตอนนี้เรารู้วิธีส่งต่อการประกาศประเภท และเรามีคอมพ์แคปซูลพอยน์เตอร์แล้ว เราก็พร้อมที่จะสร้างออบเจ็กต์ที่เป็นส่วนประกอบของแคปซูลจริงๆ
‫แล้วเราจะทำในวิดีโอหน้า
‫เจอกันเร็วๆนี้ครับ