คำถามติดแท็ก operator-overloading

Operator overloading เป็นคุณลักษณะของภาษาโปรแกรมที่อนุญาตให้ใช้งานแบบกำหนดเองสำหรับตัวดำเนินการขึ้นอยู่กับประเภทของตัวถูกดำเนินการที่เกี่ยวข้อง บางภาษาอนุญาตให้กำหนดโอเปอเรเตอร์ใหม่ในขณะที่ภาษาอื่นอนุญาตให้กำหนดนิยามใหม่ของตัวดำเนินการที่มีอยู่เท่านั้น

2
ตัวดำเนินการมากเกินไป: ฟังก์ชันสมาชิกเทียบกับฟังก์ชันที่ไม่ใช่สมาชิก?
ฉันอ่านว่าโอเปอเรเตอร์โอเวอร์โหลดที่ประกาศว่าเป็นฟังก์ชันสมาชิกนั้นไม่สมมาตรเนื่องจากสามารถมีได้เพียงพารามิเตอร์เดียวและพารามิเตอร์อื่นที่ส่งผ่านโดยอัตโนมัติคือthisตัวชี้ ดังนั้นจึงไม่มีมาตรฐานที่จะเปรียบเทียบได้ ในทางกลับกันโอเปอเรเตอร์ที่โอเวอร์โหลดถูกประกาศว่า a friendเป็นแบบสมมาตรเนื่องจากเราส่งผ่านอาร์กิวเมนต์ประเภทเดียวกันสองอาร์กิวเมนต์ดังนั้นจึงสามารถเปรียบเทียบกันได้ คำถามของฉันคือเมื่อฉันยังสามารถเปรียบเทียบค่าของตัวชี้กับข้อมูลอ้างอิงได้ทำไมเพื่อนถึงชอบ? (การใช้เวอร์ชันอสมมาตรให้ผลลัพธ์เหมือนกับแบบสมมาตร) เหตุใดอัลกอริทึม STL จึงใช้เฉพาะเวอร์ชันสมมาตร

10
ตัวดำเนินการ C # เกินสำหรับ `+ =`?
ฉันพยายามทำโอเปอเรเตอร์โอเวอร์โหลด+=แต่ทำไม่ได้ ฉันสามารถทำให้ตัวดำเนินการเกินพิกัดสำหรับ+. มาได้ยังไง? แก้ไข เหตุผลนี้ใช้ไม่ได้คือฉันมีคลาส Vector (พร้อมช่อง X และ Y) ลองพิจารณาตัวอย่างต่อไปนี้ vector1 += vector2; หากตัวดำเนินการของฉันโอเวอร์โหลดถูกตั้งค่าเป็น: public static Vector operator +(Vector left, Vector right) { return new Vector(right.x + left.x, right.y + left.y); } จากนั้นผลลัพธ์จะไม่ถูกเพิ่มลงใน vector1 แต่ vector1 จะกลายเป็น Vector ใหม่โดยการอ้างอิงเช่นกัน

13
ฉันจะตรวจสอบ null ในโอเวอร์โหลดตัวดำเนินการ '==' โดยไม่มีการเรียกซ้ำแบบไม่สิ้นสุดได้อย่างไร
สิ่งต่อไปนี้จะทำให้เกิดการเรียกซ้ำแบบไม่สิ้นสุดในวิธีการโอเวอร์โหลดตัวดำเนินการ == Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (foo1 == null) return foo2 == null; return foo1.Equals(foo2); } ฉันจะตรวจสอบค่าว่างได้อย่างไร

6
มีวิธีทำ method overloading ใน TypeScript หรือไม่?
มีวิธีทำ method overloading ในภาษา TypeScript หรือไม่? ฉันต้องการบรรลุสิ่งนี้: class TestClass { someMethod(stringParameter: string): void { alert("Variant #1: stringParameter = " + stringParameter); } someMethod(numberParameter: number, stringParameter: string): void { alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter); } } var testClass = new TestClass(); testClass.someMethod("string …


5
__lt__ แทน __cmp__
Python 2.x มีสองวิธีในการโอเวอร์โหลดตัวดำเนินการเปรียบเทียบ__cmp__หรือ "ตัวดำเนินการเปรียบเทียบที่สมบูรณ์" เช่น__lt__. การเปรียบเทียบที่มากเกินไปนั้นเป็นที่ต้องการ แต่เหตุใดจึงเป็นเช่นนั้น ตัวดำเนินการเปรียบเทียบแบบ Rich นั้นง่ายกว่าในการใช้งานแต่ละตัว แต่คุณต้องใช้ตัวดำเนินการหลายตัวด้วยตรรกะที่เหมือนกัน อย่างไรก็ตามหากคุณสามารถใช้การcmpสั่งซื้อในตัวและทูเพิล__cmp__ได้ก็จะค่อนข้างง่ายและตอบสนองการเปรียบเทียบทั้งหมด: class A(object): def __init__(self, name, age, other): self.name = name self.age = age self.other = other def __cmp__(self, other): assert isinstance(other, A) # assumption for this example return cmp((self.name, self.age, self.other), (other.name, other.age, other.other)) ความเรียบง่ายนี้ดูเหมือนจะตอบสนองความต้องการของฉันได้ดีกว่าการใช้การเปรียบเทียบที่สมบูรณ์ทั้ง 6 (!) มากเกินไป …

9
Javascript: ตัวดำเนินการมากเกินไป
ฉันทำงานกับ JavaScript มาสองสามวันแล้วและมาถึงจุดที่ฉันต้องการโอเวอร์โหลดตัวดำเนินการสำหรับวัตถุที่ฉันกำหนดไว้ หลังจากการ จำกัด Google ในการค้นหาสิ่งนี้ดูเหมือนว่าคุณไม่สามารถทำสิ่งนี้ได้อย่างเป็นทางการ แต่ก็มีคนไม่กี่คนที่อ้างว่าวิธีการดำเนินการนี้ที่ยืดเยื้อมานาน โดยพื้นฐานแล้วฉันสร้างคลาส Vector2 และต้องการทำสิ่งต่อไปนี้: var x = new Vector2(10,10); var y = new Vector2(10,10); x += y; //This does not result in x being a vector with 20,20 as its x & y values. แต่ฉันต้องทำสิ่งนี้: var x = new Vector2(10,10); var y = …

4
ตัวดำเนินการ << ต้องใช้อาร์กิวเมนต์เดียว
อา #include "logic.h" ... class A { friend ostream&amp; operator&lt;&lt;(ostream&amp;, A&amp;); ... }; logic.cpp #include "a.h" ... ostream&amp; logic::operator&lt;&lt;(ostream&amp; os, A&amp; a) { ... } ... เมื่อฉันรวบรวมมันบอกว่า: std :: ostream &amp; logic :: operator &lt;&lt; (std :: ostream &amp;, A &amp;) 'ต้องใช้อาร์กิวเมนต์เดียว อะไรคือปัญหา?

18
Operator [] [] เกินพิกัด
เป็นไปได้ไหมที่จะโอเวอร์โหลด[]ตัวดำเนินการสองครั้ง ในการอนุญาตสิ่งนี้: function[3][3](เช่นในอาร์เรย์สองมิติ) ถ้าเป็นไปได้ฉันต้องการดูโค้ดตัวอย่าง

16
วิธีเขียนโค้ดตัวดำเนินการ modulo (%) ใน C / C ++ / Obj-C ที่จัดการตัวเลขติดลบ
สัตว์เลี้ยงตัวหนึ่งของฉันเกลียดภาษาที่ได้รับ C (ในฐานะนักคณิตศาสตร์) ก็คือ (-1) % 8 // comes out as -1, and not 7 fmodf(-1,8) // fails similarly ทางออกที่ดีที่สุดคืออะไร? C ++ ช่วยให้แม่แบบและตัวดำเนินการทำงานมากเกินไป แต่ทั้งสองอย่างนี้เป็นน้ำที่ขุ่นมัวสำหรับฉัน ตัวอย่างที่ได้รับอย่างซาบซึ้ง

9
คุณจะโอเวอร์โหลดโอเปอเรเตอร์ [] ในจาวาสคริปต์ได้อย่างไร
ฉันไม่สามารถหาวิธีในการโอเวอร์โหลดโอเปอเรเตอร์ [] ในจาวาสคริปต์ได้ มีใครรู้บ้าง? ฉันกำลังคิดเกี่ยวกับ ... MyClass.operator.lookup(index) { return myArray[index]; } หรือฉันไม่ได้มองสิ่งที่ถูกต้อง

3
unique_ptr <0 หรือผู้ปฏิบัติงานทำอะไรน้อยกว่า
ฉันกำลังจัดการกับรหัสที่ฉันไม่ได้เขียน ฉันมีคำสั่งนี้: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } ดังนั้นp &lt; 0ในบริบทนี้หมายความว่าอย่างไร บนหน้าเอกสารผมเชื่อว่ากรณีของฉันเป็น16) y &lt; nullptrที่เป็น0nullptr แต่มันจะทำอะไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.