วิธีสร้างตัวดำเนินการหลายตัวที่โอเวอร์โหลดในการเขียนโปรแกรมเชิงวัตถุ c ++ เช่น obj [10] = 3 พร้อมด้วยตัวดำเนินการ [] และตัวดำเนินการ =

ฉันมีคลาสที่แน่นอนและฉันต้องการสร้างโอเปอเรเตอร์ 2 ตัวที่จะทำงานร่วมกัน

เช่นคลาสที่มีอาร์เรย์ และฉันต้องการเปลี่ยนดัชนีบางตัวในอาร์เรย์

เช่นนี้ obj[3]=5

เป็นไปได้ไหม? ถ้าใช่ ทำอย่างไร?

นี่คือรหัสที่ฉันทำสำหรับตัวดำเนินการ []


double Polynomial::operator[](int index) const {
    int maxT = this->currentMax;
    if (index > 0 && index < this->getDegree(false))
        return this->coefficients[index];
    cout << "overflow in index";
    system("pause");
}


person Tal K    schedule 22.04.2020    source แหล่งที่มา
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? ตัวดำเนินการมอบหมายการโอเวอร์โหลดด้วยตัวดำเนินการตัวห้อย   -  person scohe001    schedule 22.04.2020
comment
แม้ว่าการตรวจสอบขอบเขตใน operator[] จะไม่ใช่เรื่องผิด แต่ก็ถือว่าไม่ธรรมดา คอนเทนเนอร์ส่วนใหญ่จะข้ามการตรวจสอบขอบเขตใน operator[] (เพื่อให้เร็วที่สุด) และจัดเตรียมฟังก์ชันสมาชิกที่เรียกว่า at() ซึ่งจะตรวจสอบขอบเขตและส่งข้อยกเว้นหาก index อยู่นอกขอบเขต อย่างไรก็ตาม index โดยปกติควรเป็นประเภท unsigned เช่น size_t นี่คือตัวอย่างง่ายๆ ในการเล่น: godbolt.org/z/qr26cd   -  person Ted Lyngmo    schedule 22.04.2020
comment
ไม่มีตัวดำเนินการ ตัวเดียว []= ดังนั้นคุณจึงไม่สามารถโอเวอร์โหลดได้ คุณสามารถโอเวอร์โหลดตัวดำเนินการ [] และตัวดำเนินการ = ได้   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews ฉันไม่เห็นโอเปอเรเตอร์ []= พูดถึงหรือบอกเป็นนัย ชื่อเรื่องกล่าวถึง [] และ = แยกกัน   -  person Ted Lyngmo    schedule 22.04.2020
comment
@TedLyngmo เมื่อฉันอ่านชื่อเรื่อง มันไม่ได้พูดถึงการใช้ [] และ = แยกกัน   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews บางทีฉันอาจมีแว่นตาให้อภัยอยู่ที่ :-) [] โอเปอเรเตอร์และ = โอเปอเรเตอร์ ฟังดูเหมือน operator[] และ operator= สำหรับฉันและการใช้งาน operator[] (ไม่ใช่ operator[]=) ก็ทำให้เช่นกัน ฉันคิดว่า OP รู้ว่าพวกเขาเป็นผู้ดำเนินการที่แยกจากกัน   -  person Ted Lyngmo    schedule 22.04.2020


คำตอบ (1)


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

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

double& Polynomial::operator[](size_t index)  {  // <-- no const
    return coefficients[index];
}

สมมติว่าคุณมีเมธอด size คุณก็เขียนลูปได้:

for (size_t i=0; i< poly.size(); ++i) {
    poly[i] = i;
}

PS: system("pause") เป็นสิ่งที่ไม่ต้องดำเนินการ โปรดดูที่ system(pause); - ทำไมมันผิด?

person 463035818_is_not_a_number    schedule 22.04.2020