ข้อผิดพลาดคือการดำเนินการที่อาจเป็นผลมาจากการทำงานที่ผิดปกติของรหัสใดๆ ไม่สามารถตรวจพบข้อผิดพลาดในขณะที่เขียนจนกว่าเราจะดำเนินการโค้ดหรือคอมไพล์ ข้อผิดพลาดบางอย่างทำให้รหัสไม่สามารถดำเนินการได้จนกว่าจะถูกลบออก วันนี้เราจะพูดถึงข้อผิดพลาดที่เกิดขึ้นเมื่อคอมไพล์โปรแกรมด้วย นั่นคือ “ข้อผิดพลาด: ไม่ตรงกับ 'โอเปอเรเตอร์='” ข้อผิดพลาดนี้อาจเกิดจากสาเหตุต่างๆ เช่น: หากเราผ่านตัวชี้ที่ต้องส่งผ่านสตริง การแก้ไขตัวแปรคงที่ ฯลฯ ไม่ใช่เรื่องยากที่จะลบข้อผิดพลาด 'ไม่มีการทำงานมากเกินไป' แต่งานหลักคือการ เข้าใจข้อผิดพลาดเพราะมันแสดงข้อผิดพลาดโดยไม่มีคำอธิบายของข้อผิดพลาด
ไวยากรณ์
ไม่มีไวยากรณ์ที่กำหนดไว้ล่วงหน้าดังกล่าวสำหรับข้อผิดพลาดนี้ เนื่องจากข้อผิดพลาดนี้ไม่ได้เป็นส่วนหนึ่งของโค้ดหรือเอาต์พุต เป็นเพียงความกำกวมที่อาจเกิดจากโค้ดที่ไม่ถูกต้อง ดังที่เราเห็นด้านล่างเป็นตัวอย่างของข้อผิดพลาดที่อาจเกิดขึ้น
ข้อผิดพลาด : ไม่มีการแข่งขัน สำหรับ 'ผู้ประกอบการ = ’
ตัวอย่าง # 01:
ให้เรามีความคิดเกี่ยวกับข้อผิดพลาดนี้และวิธีการแก้ไข เพื่อให้เข้าใจได้ดีขึ้น เราจะทำตัวอย่างที่เราจะส่งชื่อโดยใช้ออบเจกต์ไปยังฟังก์ชัน และจากนั้นมันจะแสดงออกมา ก่อนอื่นเราจะรวมไฟล์ส่วนหัว iostream หลังจากนั้นเราจะประกาศคลาสชื่อ “my_object” ภายในนั้น เราได้ประกาศตัวแปรสตริงสองตัวชื่อ “F_name และ “L_name” โดย “F_name” ระบุชื่อของบุคคล โดยที่ “L_name” ระบุนามสกุลของบุคคลนั้น
ต่อไป เราได้ประกาศตัวสร้างสาธารณะชื่อ “my_object()” ซึ่งเราได้กำหนดค่า Null ให้กับทั้งตัวแปร “F_name” และ “L_name” หลังจากนั้น เราประกาศฟังก์ชันอื่นที่เราได้ส่งผ่านตัวแปรประเภทสตริง “fn” และ “ln” ข้างในนั้นเราเรียกเมธอด name_set() จากนั้น เราประกาศฟังก์ชันสมาชิกสองฟังก์ชัน “show()” และ “name_set()” เมื่อเรียกใช้ฟังก์ชัน “show() จะแสดงชื่อและนามสกุลพร้อมกัน ในขณะที่ในฟังก์ชันสมาชิก “set_name()” เราส่งผ่านตัวแปรสตริงสองตัวที่เป็นประเภทสตริง “fn” และ “ln” ซึ่งเราได้ส่งต่อไปยังตัวสร้างที่สองด้วย
ตอนนี้ ใช้โอเปอเรเตอร์การกำหนดสำเนาของคลาส my_object เราใช้พารามิเตอร์ประเภท “my_object” หนึ่งพารามิเตอร์ คอมไพเลอร์ประกาศเสมอว่าเป็นสมาชิกสาธารณะแบบอินไลน์ของคลาสใดๆ ภายในสมาชิกนี้ เราได้กำหนด src.F_name ให้กับ “F_name” และ src.L_name ให้กับ “L_name” ซึ่งเราได้เก็บสำเนาของ “F_name” และ “L_name” ไว้ สิ่งนี้จะถูกส่งต่อไปยังสมาชิกของคลาส my_object ตอนนี้ เราได้ประกาศอ็อบเจกต์ของคลาส my_cobject ชื่อ “name1” ซึ่งเราได้ส่งสตริง 2 สาย “Anna” และ “smith” เป็นอาร์กิวเมนต์ สิ่งนี้จะเรียกตัวสร้างและแสดงชื่อพร้อมกับนามสกุล
หลังจากนั้น เราสร้างอ็อบเจกต์ “name2” ขึ้นมาอีกอัน จากนั้นจึงกำหนดชื่อให้กับอ็อบเจกต์นั้นแยกกัน หลังจากส่งค่าไปยังคอนสตรัคเตอร์ของออบเจกต์ทั้งสองแล้ว เราเรียกเมธอด show() ซึ่งจะแสดงชื่อของออบเจกต์ทั้งสองเป็น 'nam1' และ 'name2' ในตอนท้ายของโค้ด เราคืนค่า Null และดำเนินการโค้ดของเรา
รวมระดับ my_object {
ส่วนตัว :
มาตรฐาน :: สตริง F_name, L_name ;
สาธารณะ :
my_object ( ) { F_ชื่อ = ' ' ; L_name = ' ' ; }
my_object ( มาตรฐาน :: สตริง fn, มาตรฐาน :: สตริง ล ) {
name_set ( ฟน, ลน ) ;
}
เป็นโมฆะ แสดง ( ) { มาตรฐาน :: ศาล << 'ชื่อคือ' << F_ชื่อ << ' ' << L_name << '. \n ' ; }
เป็นโมฆะ name_set ( มาตรฐาน :: สตริง fn, มาตรฐาน :: สตริง ล ) { F_ชื่อ = ฉ ; L_name = ล ; }
my_object & ผู้ประกอบการ = ( คอสต์ my_object & src ) {
F_ชื่อ = src. F_ชื่อ ;
L_name = src. L_name ;
กลับ * นี้ ;
}
} ;
นานาชาติ หลัก ( นานาชาติ อาร์จีซี, ถ่าน ** หาเรื่อง ) {
ชื่อ my_object1 ( 'แอนนา' , 'สมิธ' ) ;
ชื่อ my_object2 ;
ชื่อ2 = ( 'แอนนา' , 'สมิธ' ) ;
ชื่อ1. แสดง ( ) ;
ชื่อ2. แสดง ( ) ;
กลับ 0 ;
}
หลังจากดำเนินการโค้ดของเรา เรามีข้อผิดพลาดนี้ซึ่งแสดงว่าเราเขียนโค้ดผิดในบรรทัดที่ 24 ซึ่งระบุประเภทของข้อผิดพลาดที่พบ “ข้อผิดพลาด: ไม่ตรงกับ ‘ตัวดำเนินการ=’” ตอนนี้ เราจะพยายามแก้ไขข้อผิดพลาดนี้
สำหรับการแก้ไขข้อผิดพลาดนี้ เรามีหลายวิธีในการส่งค่าไปยังตัวสร้างของคลาสใดๆ ในวิธีแรก เราจะกำหนดออบเจกต์ “name1” ให้กับ “name2” เนื่องจากเราได้ส่งค่าที่เหมือนกันไปยังออบเจ็กต์ทั้งสองแล้ว จึงไม่จำเป็นต้องแยกส่ง ตอนนี้เราดำเนินการรหัส
นานาชาติ หลัก ( นานาชาติ อาร์จีซี, ถ่าน ** หาเรื่อง ) {ชื่อ my_object1 ( 'แอนนา' , 'สมิธ' ) ;
ชื่อ my_object2 ;
ชื่อ2 = ชื่อ1 ;
ชื่อ1. แสดง ( ) ;
ชื่อ2. แสดง ( ) ;
หลังจากทำการเปลี่ยนแปลงโค้ดตามที่แสดงด้านบนแล้ว เราได้ผลลัพธ์ตามตัวอย่างด้านล่าง เราได้แสดงชื่อที่ส่งไปยังคอนสตรัคเตอร์แสดงได้สำเร็จโดยไม่มีข้อผิดพลาดใดๆ
วิธีที่สองในการแก้ไขข้อผิดพลาดนี้คือเมื่อเราต้องส่งค่าที่แตกต่างกันไปยังวัตถุทั้งสอง เราจะใช้ชื่อคลาสพร้อมกับค่าที่จะส่งไปยังตัวสร้างเป็นอาร์กิวเมนต์ เราส่งชื่อแรกว่า 'jhone' และชื่อที่สอง 'smith' จากนั้นเราดำเนินการรหัส
นานาชาติ หลัก ( นานาชาติ อาร์จีซี, ถ่าน ** หาเรื่อง ) {ชื่อ my_object1 ( 'แอนนา' , 'สมิธ' ) ;
ชื่อ my_object2 ;
ชื่อ2 = my_object ( 'จอห์นสมิ ธ' ) ;
ชื่อ1. แสดง ( ) ;
ชื่อ2. แสดง ( ) ;
หลังจากรันโค้ดที่เพิ่มด้านบนแล้ว เราก็จะได้ผลลัพธ์ดังที่แสดงด้านล่าง สำหรับวัตถุ “name1” จะแสดงชื่อ “Anna smith” และสำหรับวัตถุที่สอง “name2” จะแสดงชื่อ “Jhone Smith” แต่คราวนี้รหัสของเราทำงานได้อย่างถูกต้องโดยไม่มีข้อผิดพลาดใดๆ
ตอนนี้เราจะลองวิธีอื่นในการรันโค้ดของเราให้สำเร็จ ในกรณีข้างต้น เราพยายามกำหนดค่าให้กับวัตถุโดยใช้ตัวดำเนินการกำหนด แต่คราวนี้เราจะส่งค่าในช่วงเวลาของการประกาศวัตถุ ดังที่เราเห็นในตัวอย่างด้านล่าง ในเวลาที่ประกาศออบเจ็กต์ 'name1' เราส่งค่าเป็นอาร์กิวเมนต์ไปยังออบเจ็กต์โดยทำซ้ำขั้นตอนเดียวกันสำหรับ 'name2' ตอนนี้เรารันโค้ดอีกครั้ง
นานาชาติ หลัก ( นานาชาติ อาร์จีซี, ถ่าน ** หาเรื่อง ) {ชื่อ my_object1 ( 'แอนนา' , 'สมิธ' ) ;
ชื่อ my_object2 ( 'จอห์นสมิ ธ' ) ;
ชื่อ1. แสดง ( ) ;
ชื่อ2. แสดง ( ) ;
หลังจากโค้ดถูกดำเนินการในครั้งนี้ เราไม่พบข้อผิดพลาดใด ๆ ซึ่งหมายความว่าสิ่งนี้จะป้องกันเราจากข้อผิดพลาดใด ๆ
บทสรุป
เราได้กล่าวถึงข้อผิดพลาดที่เราอาจเผชิญขณะทำงานกับฟังก์ชันที่เข้าถึงได้จากชั้นเรียนโดยสังเขป เรายังได้ศึกษาสาเหตุและวิธีการแก้ไขข้อผิดพลาด “ไม่ทำงานมากเกินไป” ข้อผิดพลาดนี้ส่วนใหญ่เข้าใจยากสำหรับโปรแกรมเมอร์มือใหม่ ดังนั้นเราจึงพยายามให้พวกเขาแก้ไขข้อผิดพลาดนี้โดยการใช้ตัวอย่างและคำอธิบาย