ตัวชี้ฟังก์ชั่นสมาชิก C ++

Taw Chi Fang Kchan Smachik C



ในภาษา C++ ตัวชี้ฟังก์ชันสมาชิกช่วยในการอ้างอิงฟังก์ชันสมาชิกภายในคลาส โดยจัดเตรียมวิธีการบันทึกและเรียกใช้ฟังก์ชันสมาชิกบนอินสแตนซ์ของคลาส ซึ่งทำให้เกิดความยืดหยุ่นและความสามารถในการขยายในสถานการณ์ต่างๆ การใช้งานทั่วไปอย่างหนึ่งของตัวชี้ฟังก์ชันสมาชิกคือเมื่อต้องทริกเกอร์ลักษณะการทำงานที่แตกต่างกันตามเงื่อนไขรันไทม์ แอปพลิเคชันสามารถเลือกและเรียกลักษณะการทำงานที่เหมาะสมได้แบบไดนามิกโดยใช้พอยน์เตอร์ไปยังฟังก์ชันสมาชิก นอกจากนี้ ตัวชี้ฟังก์ชันสมาชิกยังมีประโยชน์ในสถานการณ์ที่จำเป็นต้องมีการแยกส่วนประกอบของระบบ

ตัวอย่างที่ 1:

เรารวมไฟล์ส่วนหัว “iostream” เพื่อให้ง่ายต่อการใช้งานฟังก์ชันที่กำหนดไว้ จากนั้นเราก็มี 'namespace std' ภายใต้สิ่งนี้ เราสร้างคลาสชื่อ 'MyNewClass' และใช้คอนสตรัคเตอร์ 'สาธารณะ'

ใน 'สาธารณะ' เราสร้างฟังก์ชันสมาชิกชื่อ 'myFunc' และประกาศ 'int num' เป็นพารามิเตอร์ของ 'myFunc()' ด้านล่างนี้ เราใช้ 'cout' และเรียกใช้เมธอด main() ด้านล่างนี้ ซึ่งเราสร้างตัวชี้ฟังก์ชันสมาชิก เราประกาศตัวชี้ 'MyFuncPtr' ให้กับประเภทฟังก์ชันสมาชิก โดยระบุคลาส 'MyNewClass' และประเภทพารามิเตอร์ (int)







หลังจากนี้ เราสร้างคลาสอ็อบเจ็กต์ชื่อ “Class_obj” จากนั้นเรียกใช้ฟังก์ชันสมาชิกโดยใช้ตัวชี้ “*MyFuncPtr” โดยวางอ็อบเจ็กต์คลาสด้วยสิ่งนี้ เรากำหนด '10' เป็นพารามิเตอร์เพื่อเรนเดอร์สิ่งนี้เมื่อเราเรียกใช้ตัวชี้ฟังก์ชันสมาชิก



รหัส 1:

#รวม

ใช้เนมสเปซมาตรฐาน -

คลาส MyNewClass -

สาธารณะ -

เป็นโมฆะ myFunc - ภายใน หนึ่ง - -

ศาล - 'คุณค่าคือ' - หนึ่ง - สิ้นสุด -

-

- -

ภายใน หลัก - - -

เป็นโมฆะ - MyNewClass - MyFuncPtr - - ภายใน - - - MyNewClass - myFunc -

MyNewClass Class_obj -

- คลาส_obj. - MyFuncPtr - - 10 - -

กลับ 0 -

-

เอาท์พุท:



ข้อมูลนี้แสดงให้เห็นการทำงานของตัวชี้ฟังก์ชันสมาชิก ตัวชี้ฟังก์ชันสมาชิกสามารถใช้เพื่อเปิดฟังก์ชันสมาชิกแบบไดนามิกตามเงื่อนไขปัจจุบัน





ตัวอย่างที่ 2:

หากต้องการใช้ฟังก์ชันที่กำหนดไว้ในไฟล์ส่วนหัว 'iostream' แบบง่ายๆ เราจะรวม 'iostream' ไว้ที่นี่ “เนมสเปซมาตรฐาน” จะอยู่ถัดไป ข้างใต้นั้น เราสร้างคลาส 'Test' จากนั้นใช้ Constructor 'public' เรากำหนดฟังก์ชันสมาชิก ” myTestingFunc ” ใน “สาธารณะ” และตั้งค่า “int t_value” เป็นพารามิเตอร์สำหรับ ” myTestingFunc()” ในกรณีนี้ ด้านล่างใช้ฟังก์ชัน 'cout' และเรียกเมธอด main() จากนั้นเราสร้างตัวชี้ฟังก์ชันสมาชิก



เราระบุคลาส 'Test' และตัวชี้ฟังก์ชันสมาชิก '*MyTestFuncPtr' ที่นี่ เรากำหนด “&Test::myTestingFunc” ให้กับตัวชี้ฟังก์ชันสมาชิกซึ่งถูกประกาศว่าเป็น “void (Test::*MyTestFuncPtr)(int)”

ต่อไป เราสร้างคลาสอ็อบเจ็กต์ “t_obj” และใช้สิ่งนี้เพื่อเรียกใช้ฟังก์ชันสมาชิกโดยใส่คลาสอ็อบเจ็กต์และใช้ตัวชี้ “*MyTestFuncPtr” เพื่อให้สิ่งนี้ถูกนำเสนอเมื่อเราเรียกใช้ตัวชี้ฟังก์ชันสมาชิก เราจะกำหนด '932' เป็นพารามิเตอร์

รหัส 2:

#รวม

ใช้เนมสเปซมาตรฐาน -

การทดสอบในชั้นเรียน -

สาธารณะ -

เป็นโมฆะ myTestingFunc - ภายใน t_value - -

ศาล - “ค่าทดสอบคือ” - t_value - สิ้นสุด -

-

- -

ภายใน หลัก - - -

เป็นโมฆะ - ทดสอบ - MyTestFuncPtr - - ภายใน - - - ทดสอบ - myTestingFunc -

ทดสอบ t_obj -

- t_obj. - MyTestFuncPtr - - 932 - -

กลับ 0 -

-

เอาท์พุท:

ผลลัพธ์ของโค้ดที่กำหนดจะแสดงผล เราจะเห็นว่าเราเรียก 'ตัวชี้ฟังก์ชันสมาชิก' ด้วยวัตถุคลาสดังที่แสดงไว้ที่นี่

ตัวอย่างที่ 3:

คลาสที่เราสร้างในโค้ดนี้คือ 'MyNewCar' ซึ่งเราใช้ตัวสร้าง 'สาธารณะ' และสร้างฟังก์ชันสมาชิกในนั้นซึ่งก็คือ 'startCarEngine()' ในฟังก์ชันนี้ เราจะเพิ่ม 'cout' ซึ่งจะแสดงผลเมื่อเราเรียกใช้ฟังก์ชันนี้ในโค้ดของเรา จากนั้นเราสร้างฟังก์ชันสมาชิกอีกอันหนึ่งซึ่งก็คือ 'stopCarEngine()' และใช้ 'cout' อีกครั้งในฟังก์ชันสมาชิกนี้

หลังจากนี้ เราจะเรียกใช้ฟังก์ชัน main() จากนั้นจึงประกาศตัวชี้ฟังก์ชันสมาชิกซึ่งก็คือ “MyNewCar::*carEngineFunc()” ด้านล่างนี้ เราสร้างออบเจ็กต์คลาส “MyNewCar” ด้วยชื่อ “myCar_obj” จากนั้นเรากำหนดฟังก์ชัน 'startCarEngine' ให้กับตัวชี้ 'carEngineFunc' ข้างใต้นี้ เราเรียกฟังก์ชันนี้โดยใช้ตัวชี้ 'carEngineFunc' โดยการใส่ชื่อวัตถุลงไป

ต่อไป เราจะกำหนดฟังก์ชัน 'stopCarEngine' ใหม่ให้กับตัวชี้ 'carEngineFunc' ด้านล่างนี้ เราเรียกฟังก์ชันนี้โดยส่งชื่อวัตถุพร้อมกับการอ้างอิง 'carEngineFunc'

รหัส 3:

#รวม

ใช้เนมสเปซมาตรฐาน -

คลาส MyNewCar -

สาธารณะ -

เป็นโมฆะ startCarEngine - - -

ศาล - “เครื่องยนต์ของรถสตาร์ท” - สิ้นสุด -

-

เป็นโมฆะ stopCarEngine - - -

ศาล - “เครื่องยนต์ของรถหยุดทำงาน” - สิ้นสุด -

-

- -

ภายใน หลัก - - -

เป็นโมฆะ - มายนิวคาร์ - ฟังก์ชั่นรถเครื่องยนต์ - - - -

MyNewCar myCar_obj -

ฟังก์ชั่นรถเครื่องยนต์ - - มายนิวคาร์ - startCarEngine -

- myCar_obj. - ฟังก์ชั่นรถเครื่องยนต์ - - - -

ฟังก์ชั่นรถเครื่องยนต์ - - มายนิวคาร์ - stopCarEngine -

- myCar_obj. - ฟังก์ชั่นรถเครื่องยนต์ - - - -

กลับ 0 -

-

เอาท์พุท:

ที่นี่จะแสดงการทำงานของ 'ตัวชี้ฟังก์ชันสมาชิก' เราจะเห็นว่าเราได้สร้างตัวชี้ฟังก์ชันสมาชิกและแสดงผลลัพธ์ที่นี่

ตัวอย่างที่ 4:

หลังจากรวมไฟล์ส่วนหัวและ 'เนมสเปซ std' แล้ว เราจะประกาศคลาส 'MyNewStudent' ที่นี่ ฟังก์ชันสมาชิก ” StudentPass()” เป็นหนึ่งในฟังก์ชันสมาชิกที่เราสร้างสำหรับคลาส “MyStudentClass” ที่เราสร้างที่นี่ นอกจากนี้เรายังเพิ่ม 'cout' ให้กับฟังก์ชันนี้ซึ่งจะเรนเดอร์เมื่อเราเรียกมันในโค้ดของเรา

ต่อไป เราจะเขียนฟังก์ชันสมาชิก “studentFail()” โดยที่เราใช้ “cout” อีกครั้ง จากนั้นจึงเรียกฟังก์ชัน main() และตัวชี้ฟังก์ชันสมาชิก “(MyNewStudent::*studentResultFunc)()” จะถูกประกาศ ด้านล่างนี้ เราสร้างอ็อบเจ็กต์ ” myStd_obj ” ซึ่งอยู่ในคลาส “MyNewStudent”

ต่อไป เราจะกำหนดฟังก์ชัน “studentPass” ให้กับตัวชี้ “studentResultFunc” ด้านล่างนั้น เราเรียกฟังก์ชันนี้โดยส่งชื่อวัตถุพร้อมกับการอ้างอิง “studentResultFunc” ฟังก์ชัน “studentFail” ถูกกำหนดใหม่ให้กับตัวชี้ ” StudentResultFunc ” ด้านล่างนี้ เราเรียกใช้เมธอดนี้โดยให้ข้อมูลอ้างอิง “carEngineFunc” และชื่ออ็อบเจ็กต์

ตอนนี้ ทั้งสองฟังก์ชันถูกเรียกที่นี่ และคำสั่งที่เรารวมไว้ในฟังก์ชันเหล่านี้จะถูกแสดงผล

รหัส 4:

#รวม

ใช้เนมสเปซมาตรฐาน -

คลาส MyNewStudent -

สาธารณะ -

เป็นโมฆะ นักเรียนผ่าน - - -

ศาล - “บัตรนักเรียน” - สิ้นสุด -

-

เป็นโมฆะ นักเรียนล้มเหลว - - -

ศาล - “นักเรียนล้มเหลว” - สิ้นสุด -

-

- -

ภายใน หลัก - - -

เป็นโมฆะ - MyNewStudent - นักเรียน ผลลัพธ์ Func - - - -

MyNewStudent myStd_obj -

นักเรียน ผลลัพธ์ Func - - MyNewStudent - นักเรียนผ่าน -

- myStd_obj. - นักเรียน ผลลัพธ์ Func - - - -

นักเรียน ผลลัพธ์ Func - - MyNewStudent - นักเรียนล้มเหลว -

- myStd_obj. - นักเรียน ผลลัพธ์ Func - - - -

กลับ 0 -

-

เอาท์พุท:

เราสร้างฟังก์ชันสมาชิกในโค้ดของเรา จากนั้นจึงสร้างตัวชี้ฟังก์ชันสมาชิก หลังจากนั้น เราเรียกฟังก์ชันสมาชิกและแสดงผลลัพธ์ที่นี่

ตัวอย่างที่ 5:

“SampleClass” ถูกสร้างขึ้นในกรณีนี้ จากนั้น ตัวชี้ฟังก์ชันสมาชิกจะถูกวางไว้ที่นี่ซึ่งก็คือ “(SampleClass::*MyFunc)()” ข้างใต้นี้ เราสร้างตัวชี้ฟังก์ชันซึ่งก็คือ “(*MyFuncPtr)()” ด้านล่างนี้ เราจะประกาศ 'ชื่อ' ของตัวแปร 'string' รวมถึงตัวชี้ฟังก์ชันสมาชิก 'MyFunc f'

หลังจากนี้ เรามีคอนสตรัคเตอร์ 'สาธารณะ' ที่เรากำหนดตัวแปรฟังก์ชันสมาชิกนี้ ด้านล่างนี้ เราสร้างฟังก์ชันสมาชิกชื่อ 'myFunc_1()' และ 'myFunc_1()' และยังเพิ่ม 'cout' ในแต่ละฟังก์ชันสมาชิกซึ่งจะแสดงเมื่อเราเรียกใช้ฟังก์ชันสมาชิกนี้

จากนั้นเราเรียกตัวชี้ฟังก์ชันสมาชิกนี้โดยใช้ “(this->*f)()” จากนั้นเราก็วางฟังก์ชันอีกครั้ง ที่นี่เราเปลี่ยนคำสั่ง 'cout' ที่เราเพิ่มไว้ก่อนหน้านี้ จากนั้น “main()” จะถูกเรียกใช้ และตัวชี้ฟังก์ชันสมาชิกถูกกำหนดเป็น “MyFunc f = &SampleClass::myFunc_2”

จากนั้นตัวชี้ฟังก์ชันยังถูกกำหนดเป็น “MyFuncPtr fp = myFunc_1” หลังจากนี้ เราพิมพ์ “(a.*f)()” เพื่อใช้ตัวชี้ฟังก์ชันสมาชิก “b.func” ถูกวางไว้เพื่อใช้ฟังก์ชั่นสมาชิก จากนั้นเราวาง 'fp()' เพื่อเรียกใช้ตัวชี้ฟังก์ชัน

รหัส 5:

#รวม

ใช้เนมสเปซมาตรฐาน -

คลาส SampleClass -

พิมพ์def เป็นโมฆะ - ตัวอย่างคลาส - MyFunc - - - -

พิมพ์def เป็นโมฆะ - - MyFuncPtr - - - -

คลาส SampleClass -

ชื่อสตริง -

MyFunc ฉ -

สาธารณะ -

ตัวอย่างคลาส - ค่าคงที่ ถ่าน - ชื่อ -

- ชื่อ - ชื่อ - -

- - ตัวอย่างคลาส - myFunc_1 -

- -

เป็นโมฆะ myFunc_1 - - - ศาล - ชื่อ - “เราเรียกฟังก์ชั่น 1 ที่นี่” - สิ้นสุด - -

เป็นโมฆะ myFunc_2 - - - ศาล - ชื่อ - 'เราเรียกฟังก์ชัน 2 ที่นี่' - สิ้นสุด - -

เป็นโมฆะ ฟังก์ชั่น - - -

- นี้ - - - - -

-

- -

เป็นโมฆะ myFunc_1 - - - ศาล - 'ฟังก์ชั่นแรก' - สิ้นสุด - -

เป็นโมฆะ myFunc_2 - - - ศาล - 'ฟังก์ชั่นที่สอง' - สิ้นสุด - -

ภายใน หลัก - -

-

MyFunc ฉ - - ตัวอย่างคลาส - myFunc_2 -

MyFuncPtr fp - myFunc_1 -

ตัวอย่างคลาส ก - 'อันดับแรก - ' - - - 'ที่สอง - ' - -

- ก. - - - - -

ข. ฟังก์ชั่น - - -

เอฟพี - - -

-

เอาท์พุท:

ตอนนี้ผลลัพธ์ของโค้ดถูกเรนเดอร์ที่นี่ ซึ่งเรนเดอร์ผลลัพธ์ตามที่เราเรียกฟังก์ชันในโค้ดของเรา

บทสรุป

เราสำรวจว่า “ตัวชี้ฟังก์ชันสมาชิก” ใน C++ ช่วยให้การเชื่อมโยงแบบไดนามิก การห่อหุ้มพฤติกรรม และการจัดการการเรียกใช้ฟังก์ชันมีความยืดหยุ่นภายในบริบทของ OOP เราได้เรียนรู้ว่าการใช้ “ตัวชี้ฟังก์ชันสมาชิก” สามารถปรับปรุงความเป็นโมดูลและความยืดหยุ่นของโค้ดเบส C++ ได้อย่างมาก โดยมอบเครื่องมืออันทรงพลังสำหรับจัดการกับความท้าทายด้านการออกแบบและรันไทม์มากมาย