2012-04-16 28 views
109

Làm cách nào để chuyển con trỏ (Object *ob) đến một hàm mà nguyên mẫu là void foo(Object &)?Làm cách nào để truyền/chuyển đổi con trỏ sang tham chiếu trong C++

+0

Tiêu đề này nói "đúc [sic] tham chiếu đến con trỏ" nhưng câu hỏi bắt đầu với một con trỏ và cần một tham chiếu. Đó là hướng nào? – MSalters

+0

@MSalters phải là * chuyển đổi *. Tôi đang chỉnh sửa nó. Nhưng tôi đã tìm kiếm bất kỳ giải pháp tôi nhận được, vì vậy tôi đã đề cập * cast * – Dewsworld

Trả lời

147

Gọi nó như thế này:

foo(*ob); 

Lưu ý rằng không có đúc xảy ra ở đây, theo đề nghị trong tiêu đề câu hỏi của bạn. Tất cả những gì chúng ta đã làm là de-tham chiếu con trỏ tới đối tượng mà chúng ta truyền cho hàm.

+18

@Ricobob Đó là những gì xảy ra trên SO rất thường xuyên. Các câu trả lời cho các câu hỏi đơn giản có thể dễ dàng được hiểu thường thu được rất nhiều phiếu bầu. Câu trả lời dài và phức tạp cho các câu hỏi phức tạp thường nhận được rất ít những người bỏ phiếu vì cử tri không thể dễ dàng đánh giá công đức. Đối với đại diện, tôi đã không có gì về điều này vì nắp đại diện. ;-) Nhưng tôi chân thành đồng ý. Tôi muốn câu trả lời phức tạp thu hút nhiều đại diện hơn. –

+0

@DavidHeffernan Có điều này có vẻ là vấn đề - tôi đoán đó là một vấn đề cần thực hiện đối với MetaSO - nếu có ai đó chưa nêu lên điều đó. – Ricibob

+0

@ricobob Tôi hy vọng nó đã được nâng lên rồi. –

31
foo(*ob); 

+0

đoán amd thêm nhiều ... thường không phải là định dạng của câu trả lời hay ở đây (mặc dù nó là chính xác trong trường hợp này), đó là lý do tại sao bạn có một downvote. – KillianDS

+5

bhhaaa, tôi đã thêm "Tôi đoán" vì nó khiến tôi viết ít nhất 30 ký tự. đó cũng là cách tôi thêm "..........." –

+10

@RoeeGavirel Tôi là cử tri lên đầu tiên của bạn bởi vì tôi cảm thấy lời đề nghị này rất khắc nghiệt. FWIW bạn có thể vượt quá giới hạn 30 char nhưng thêm nhận xét HTML mà tôi đã làm phiên bản đầu tiên của tôi về câu trả lời! Chỉnh sửa của tôi cho câu trả lời của bạn cho thấy cách thức. –

0

dụ đầy đủ cho đúc con trỏ đến đối tượng

Online demo

class myClass 
{ 
    public: 
    void sayHello() 
    { 
    cout << "Hello"; 
    } 
}; 

int main() 
{ 
    myClass* myPointer; 
    myClass myObject = myClass(* myPointer); // Cast pointer to object 
    myObject.sayHello(); 

    return 0; 
} 
+0

Tôi ngạc nhiên khi onlinegdb hoạt động với điều này, vì có nhiều vấn đề ở đây. Thứ nhất, myPointer là uninitialised - ở đâu là 'new myClass()'? Thứ hai, dòng được đánh dấu '// Truyền con trỏ tới đối tượng' làm như vậy và sau đó thực hiện một chuỗi sao chép. Xây dựng một myClass từ con trỏ uninitialised chưa được khai báo, và sau đó (tùy thuộc vào trình biên dịch) khi nó được gán cho myClass myObject. –

Các vấn đề liên quan