วิธีการส่ง / แปลงตัวชี้เป็นการอ้างอิงใน C ++


143

ฉันจะส่งตัวชี้ ( Object *ob) ไปยังฟังก์ชันที่ต้นแบบได้void foo(Object &)อย่างไร


ชื่อกล่าวว่า "cast [sic] การอ้างอิงถึงตัวชี้" แต่คำถามเริ่มต้นด้วยตัวชี้และต้องการการอ้างอิง ทิศทางไหน
MSalters

@MSalters มันควรจะเป็นแปลง ฉันกำลังแก้ไข แต่ฉันกำลังมองหาวิธีการแก้ปัญหาใด ๆ ที่ฉันได้รับดังนั้นฉันจึงพูดถึงนักแสดง
Dewsworld

คำตอบ:


210

เรียกว่าเป็นแบบนี้:

foo(*ob);

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


25
@ Ricobob นั่นคือสิ่งที่เกิดขึ้นดังนั้นบ่อยมาก คำตอบของคำถามง่าย ๆ ที่สามารถเข้าใจได้ง่ายมักจะรวบรวมคะแนนเสียงจำนวนมาก คำตอบที่ยาวและซับซ้อนสำหรับคำถามที่ซับซ้อนมักจะได้รับ upvotes น้อยเพราะผู้ลงคะแนนไม่สามารถตัดสินข้อดีได้ง่าย สำหรับตัวแทนฉันไม่มีอะไรเกี่ยวกับเรื่องนี้เพราะตัวแทนสูงสุด ;-) แต่ฉันเห็นด้วยอย่างเต็มที่ ฉันต้องการคำตอบที่ซับซ้อนรวบรวมตัวแทนมากขึ้น
David Heffernan

@ DavidHeffernan ใช่นี่น่าจะเป็นปัญหา - ฉันเดาว่ามันเป็นปัญหาที่ต้องนำไปสู่ ​​MetaSO - ถ้ามีคนไม่ได้ยกมันขึ้นมาแล้ว
Ricibob

4
สิ่งนี้สร้างสำเนาobหรือเพียงแค่แปลง (ถ้าไม่ส่ง) ตัวชี้ไปยังการอ้างอิงหรือไม่ เกิดอะไรขึ้นถ้าobเป็นnullptr?
Drew Noakes

5
@Drew มันก็แค่ชี้ dereferences ไม่มีการคัดลอก ไม่มีการแปลง ไม่มีนักแสดง วัตถุนั้นถูกส่งผ่านโดยอ้างอิงถึงฟังก์ชั่น มันเป็นข้อผิดพลาดถ้าจุดนั้นเป็นโมฆะ
David Heffernan


41
foo(*ob);

คุณไม่จำเป็นต้องร่ายมันเพราะมันเป็นชนิดของวัตถุเดียวกันคุณเพียงแค่ต้องตรวจสอบมัน


การคาดเดาและการเพิ่มจำนวนมาก ... มักไม่ใช่รูปแบบของคำตอบที่ดีที่นี่ (แม้ว่ามันจะถูกต้องในกรณีนี้) นั่นอาจเป็นเหตุผลว่าทำไมคุณถึงมีหนึ่ง downvote
KillianDS

5
bhhaaa ฉันเพิ่ม "ฉันเดา" เพราะมันทำให้ฉันเขียนอย่างน้อย 30 ตัวอักษร นั่นเป็นวิธีที่ฉันเพิ่ม "........... "
Roee Gavirel

10
@RoeeGavirel ฉันเป็นผู้มีสิทธิ์ลงคะแนนเสียงคนแรกของคุณเพราะฉันรู้สึกว่าการลงคะแนนเสียงรุนแรง FWIW คุณจะได้รับเกินขีด จำกัด 30 ตัว แต่เพิ่มความคิดเห็น HTML <! -----------------------------> ที่ฉันทำ รุ่นแรกของฉันของคำตอบ! การแก้ไขคำตอบของฉันแสดงให้เห็นว่า
David Heffernan

คำตอบแบบรหัสเท่านั้นโดยไม่มีคำอธิบายจะขมวดคิ้วในวันนี้
Keith M

1
@KeithM - นั่นเป็นความคิดเห็นแบบสุ่มและ -1 คำตอบนั้นได้รับเมื่อประมาณ 6 ปีที่แล้วและคำถามไม่ได้ถามว่า "ทำไม" มันถามเพียงแค่ "วิธี" เท่านั้น แต่แน่นอนฉันจะเพิ่มคำอธิบาย
Roee Gavirel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.