ข้อผิดพลาด: ไม่สามารถยกตัวอย่างคลาสนามธรรมได้

Khx Phid Phlad Mi Samarth Yk Tawxyang Khlas Namthrrm Di



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

ไวยากรณ์

ข้อความแสดงข้อผิดพลาดของข้อผิดพลาดของเรามีดังนี้:

ข้อผิดพลาด : ไม่สามารถประกาศให้ตัวแปร ‘ ’ เป็นประเภทนามธรรม ‘’ ได้

โปรดทราบว่าในวงเล็บว่างจะมีชื่อคลาสตัวแปรและนามธรรม







ข้อผิดพลาด C2259 : 'สถานะ' : ไม่สามารถยกตัวอย่างคลาสนามธรรมได้

นี่คือข้อความอื่นที่เราได้รับจากคอมไพเลอร์เมื่อเราพบข้อผิดพลาดดังกล่าว



ตัวอย่าง # 01:

เพื่อให้เข้าใจข้อผิดพลาดนี้ เราจะทำตัวอย่างที่เราจะเขียนโค้ดในลักษณะที่เราได้รับข้อผิดพลาด เพื่อจุดประสงค์นั้น เราได้เริ่มต้นคลาสด้วยชื่อ “ShapeClass” ในการทำให้คลาสนี้เป็นนามธรรม เราได้ประกาศฟังก์ชันเสมือนในนั้นด้วยชื่อ “getArea” เราได้ประกาศอีกสองฟังก์ชันด้วยชื่อ “setWidth” และ “setHeight” ตามลำดับ สิ่งที่เราต้องการทำที่นี่คือเราต้องการรับความสูงเป็นพารามิเตอร์และความกว้างเป็นพารามิเตอร์อินพุต เราจะคำนวณพื้นที่ด้วยความช่วยเหลือจากพารามิเตอร์ที่เราป้อน เราสร้างอินสแตนซ์ของคลาสในเมธอดหลัก ด้วยความช่วยเหลือของวัตถุนั้น เราได้เรียกเมธอดและเราจะส่งพารามิเตอร์อินพุตผ่านเมธอดนั้น หลังจากนั้นเราพิมพ์ผลลัพธ์เพื่อตรวจสอบผลลัพธ์



#รวมถึง

ใช้เนมสเปซมาตรฐาน ;
คลาส ShapeClass
{
สาธารณะ :
เสมือน นานาชาติ เกทาเรีย ( ) = 0 ;
เป็นโมฆะ กำหนดความกว้าง ( นานาชาติ ใน )
{
ความกว้าง = ใน ;
}
เป็นโมฆะ กำหนดความสูง ( นานาชาติ ชม. )
{
ความสูง = ชม. ;
}
มีการป้องกัน :
นานาชาติ ความกว้าง ;
นานาชาติ ความสูง ;
} ;
นานาชาติ หลัก ( เป็นโมฆะ )
{
ShapeClasssh ;
ช. กำหนดความกว้าง ( 1 ) ;
ช. กำหนดความสูง ( สอง ) ;
ศาล << 'พื้นที่สี่เหลี่ยมผืนผ้าทั้งหมด: ' << ช. เกทาเรีย ( ) << จบ ;
กลับ 0 ;
}

ระบบแสดงข้อผิดพลาดให้เราหลังจากดำเนินการโค้ดของเรา ข้อความแสดงข้อผิดพลาดแจ้งว่าเราไม่สามารถประกาศตัวแปร 'sh' เป็นนามธรรมประเภท 'shapeclass' ตอนนี้ คอมไพเลอร์พยายามสื่อว่า 'ShapeClass' เป็นประเภทนามธรรม และเราไม่สามารถประกาศตัวแปรได้ ด้วยข้อความนี้ เราสามารถเข้าใจได้อย่างชัดเจนว่าคอมไพเลอร์ไม่ยอมให้เราสร้างคลาสนามธรรมของเรา นั่นคือสาเหตุที่ระบบแจ้งข้อผิดพลาดให้เรา





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



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

ตัวอย่าง # 02:

ในตัวอย่างนี้ เราจะไม่ทำการคำนวณทางคณิตศาสตร์ใดๆ ตัวอย่างนี้เป็นตัวอย่างทั่วไปที่จะช่วยให้เราเข้าใจคลาสนามธรรมและวิธีที่คอมไพเลอร์ทำงานระหว่างเมธอดและคลาสในขณะที่รันโค้ด ในคลาสนี้ เราได้สร้างคลาสนามธรรมขึ้นมาและตั้งชื่อว่า AbsClass เราได้ประกาศคลาสอื่น “ChildClass” แต่คลาสนี้ไม่ใช่คลาสนามธรรม คลาสนี้มาจากคลาสนามธรรมของเรา

เราได้พิมพ์ “ค่าที่ส่งผ่านโดยใช้อ็อบเจกต์” ในเมธอดที่ประกาศในคลาสนามธรรม ชื่อของฟังก์ชันคือ “valueFunc” ดังที่เราได้พูดคุยกัน ร่างกายของฟังก์ชันเสมือนถูกประกาศในคลาสย่อย ในชั้นเรียนย่อยของเรา เราได้พิมพ์คำว่า “In virtual function” ในเนื้อความของฟังก์ชันเสมือนของเรา ตอนนี้เราจะส่งค่าไปยังฟังก์ชันค่าของเราและดูว่าค่าที่ถึงนั้นถูกต้องหรือไม่ ในเมธอดหลักของเรา เราได้สร้างอินสแตนซ์ของคลาสนามธรรม และด้วยความช่วยเหลือของอินสแตนซ์ เราจะเรียกใช้ฟังก์ชันเสมือนและฟังก์ชันอื่นๆ ตอนนี้เราจะดำเนินการรหัสของเรา

#รวมถึง

ใช้เนมสเปซมาตรฐาน ;
คลาส AbsClass
{
สาธารณะ :
เสมือน นานาชาติ VirtFunc ( ) = 0 ;
เป็นโมฆะ ค่าFunc ( นานาชาติ ใน )
{
ความกว้าง = ใน ;
ศาล << 'ค่าที่ส่งผ่านโดยใช้วัตถุ' << ใน << จบ ;
}
มีการป้องกัน :
นานาชาติ ความกว้าง ;
} ;
คลาส ChildClass :
AbsClass สาธารณะ
{
สาธารณะ :
นานาชาติ VirtFunc ( ) {
ศาล << 'ในฟังก์ชันเสมือนจริง' << จบ ;
}
} ;
นานาชาติ หลัก ( เป็นโมฆะ )
{
ChildClass ซีซี ;
ซีซี ค่าFunc ( 5 ) ;
ศาล << ซีซี VirtFunc ( ) << จบ ;
กลับ 0 ;
}

หลังจากดำเนินการตามรหัสของเรา เราจะได้รับข้อผิดพลาด ข้อผิดพลาดนี้โดยพื้นฐานแล้วเราไม่สามารถสร้างอินสแตนซ์ของคลาสนามธรรมซึ่งเรากำลังพยายามทำในวิธีการหลักของเรา สิ่งหนึ่งที่ควรทราบที่นี่คือตัวแปรและประเภทนามธรรมในข้อความของเรามีการเปลี่ยนแปลง

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

เมื่อดำเนินการโค้ดของเรา คอมไพเลอร์ไม่ได้เกิดข้อผิดพลาดใดๆ ในครั้งนี้ แต่ระบบได้รวบรวมรหัสของเราเรียบร้อยแล้วและให้ผลลัพธ์แก่เรา ทีนี้มาดูผลลัพธ์กัน ระบบได้พิมพ์ “ค่าที่ส่งผ่านโดยใช้วัตถุ” และ “5” เทียบกับมัน เนื่องจากเราผ่าน 5 โดยใช้อินสแตนซ์ของเราในวิธีการหลัก หลังจากนั้นก็พิมพ์บรรทัดที่เราขอให้พิมพ์ในฟังก์ชันเสมือนของเรา

บทสรุป

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