ฉันต้องการส่งตัวชี้ที่ใช้ร่วมกันไปยังฟังก์ชัน คุณสามารถช่วยฉันด้วย?
ได้เลยฉันช่วยคุณได้ ฉันถือว่าคุณมีความเข้าใจเกี่ยวกับความหมายความเป็นเจ้าของใน C ++ เป็นเช่นนั้นจริงหรือ?
ใช่ฉันสบายใจพอสมควรกับเรื่องนี้
ดี.
โอเคฉันคิดได้แค่สองเหตุผลที่จะshared_ptr
โต้แย้ง:
- ฟังก์ชั่นต้องการแบ่งปันความเป็นเจ้าของวัตถุ
- ฟังก์ชั่นนี้ทำงานบางอย่างที่ทำงานเฉพาะกับ
shared_ptr
s
สนใจอันไหน
ฉันกำลังมองหาคำตอบทั่วไปดังนั้นฉันจึงสนใจทั้งสองอย่าง ฉันอยากรู้ว่าคุณหมายถึงอะไรในกรณีที่ 2
ตัวอย่างของฟังก์ชันดังกล่าว ได้แก่ ตัวstd::static_pointer_cast
เปรียบเทียบแบบกำหนดเองหรือเพรดิเคต ตัวอย่างเช่นหากคุณต้องการค้นหา shared_ptr ที่ไม่ซ้ำกันทั้งหมดจากเวกเตอร์คุณต้องมีเพรดิเคตดังกล่าว
อ่าเมื่อฟังก์ชันต้องจัดการตัวชี้อัจฉริยะเองจริงๆ
ตรง
ในกรณีนั้นฉันคิดว่าเราควรผ่านการอ้างอิง
ใช่. และถ้ามันไม่เปลี่ยนตัวชี้คุณต้องส่งผ่านการอ้างอิง const ไม่จำเป็นต้องคัดลอกเนื่องจากคุณไม่จำเป็นต้องมีส่วนร่วมในการเป็นเจ้าของ นั่นคือสถานการณ์อื่น ๆ
ตกลงเข้าใจแล้ว เรามาพูดถึงสถานการณ์อื่น ๆ
คนที่คุณเป็นเจ้าของร่วมกัน? ตกลง. คุณเป็นเจ้าของร่วมกันได้shared_ptr
อย่างไร?
โดยการคัดลอก.
จากนั้นฟังก์ชันจะต้องทำสำเนาของ a shared_ptr
ถูกต้องหรือไม่?
เห็นได้ชัด. ดังนั้นฉันจึงส่งต่อโดยการอ้างอิงถึง const และคัดลอกไปยังตัวแปรท้องถิ่น?
ไม่นั่นเป็นการมองโลกในแง่ร้าย หากส่งผ่านโดยการอ้างอิงฟังก์ชันจะไม่มีทางเลือกอื่นนอกจากทำสำเนาด้วยตนเอง หากมีการส่งผ่านค่าคอมไพลเลอร์จะเลือกตัวเลือกที่ดีที่สุดระหว่างสำเนาและการย้ายและดำเนินการโดยอัตโนมัติ ผ่านไปเลยค่า
จุดดี. ฉันต้องจำไว้ว่าบทความ " ต้องการความเร็วหรือไม่ผ่านค่า " บ่อยขึ้น
เดี๋ยวก่อนจะเกิดอะไรขึ้นถ้าฟังก์ชันเก็บshared_ptr
ตัวแปรในสมาชิกเช่น? จะไม่ทำสำเนาซ้ำซ้อน?
ฟังก์ชันสามารถย้ายshared_ptr
อาร์กิวเมนต์ไปยังที่เก็บข้อมูลได้ การย้าย a shared_ptr
มีราคาถูกเนื่องจากไม่เปลี่ยนแปลงการนับอ้างอิงใด ๆ
อ่าความคิดที่ดี
แต่ฉันกำลังคิดถึงสถานการณ์ที่สาม: จะเกิดอะไรขึ้นถ้าคุณไม่ต้องการที่จะจัดการshared_ptr
หรือร่วมเป็นเจ้าของ?
ในกรณีshared_ptr
นั้นไม่เกี่ยวข้องกับฟังก์ชันนี้โดยสิ้นเชิง หากคุณต้องการจัดการพอยน์ตี้ให้ใช้พอยน์เตอร์แล้วปล่อยให้ผู้โทรเลือกว่าต้องการความหมายของการเป็นเจ้าของ
และฉันควรใช้ pointee โดยอ้างอิงหรือตามค่า?
ใช้กฎตามปกติ ตัวชี้อัจฉริยะจะไม่เปลี่ยนแปลงอะไร
ส่งผ่านค่าถ้าฉันจะคัดลอกส่งต่อโดยอ้างอิงหากฉันต้องการหลีกเลี่ยงสำเนา
ขวา.
อืม. ฉันคิดว่าคุณลืมสถานการณ์อื่นไปแล้ว จะเป็นอย่างไรหากฉันต้องการร่วมเป็นเจ้าของ แต่ขึ้นอยู่กับเงื่อนไขบางประการเท่านั้น
อากรณีขอบที่น่าสนใจ ฉันไม่คาดคิดว่าจะเกิดขึ้นบ่อยๆ แต่เมื่อเกิดขึ้นคุณสามารถส่งผ่านค่าและละเว้นสำเนาได้หากไม่ต้องการหรือส่งต่อโดยอ้างอิงและทำสำเนาหากต้องการ
ฉันเสี่ยงต่อการทำสำเนาซ้ำซ้อนหนึ่งชุดในตัวเลือกแรกและสูญเสียโอกาสในการย้ายครั้งที่สอง ฉันไม่สามารถกินเค้กได้หรือไม่?
หากคุณอยู่ในสถานการณ์ที่มีความสำคัญมากคุณสามารถระบุโอเวอร์โหลดได้สองค่าโดยตัวหนึ่งใช้การอ้างอิง const lvalue และอีกอันใช้การอ้างอิง rvalue หนึ่งสำเนาการเคลื่อนไหวอื่น ๆ เทมเพลตฟังก์ชันการส่งต่อที่สมบูรณ์แบบเป็นอีกทางเลือกหนึ่ง
ฉันคิดว่ามันครอบคลุมสถานการณ์ที่เป็นไปได้ทั้งหมด ขอบคุณมาก.
const std::shared_ptr<myClass>& arg1