LƯU Ý: Tôi đã tìm thấy nguồn gốc của lỗi không thực sự liên quan đến shared_ptr, chỉ khéo léo ngụy trang như vậy trong thông báo lỗi. Do đó, dưới đây là cơ bản vô nghĩa (không phải là câu trả lời, họ đang sử dụng tốt)Chuyển tiếp shared_ptr mà không khai báo lớp
-
Tôi đang gặp một số vấn đề khi dùng một shared_ptr
(tăng tại thời điểm này) mà tôi cần phải chỉ đơn giản là ra một con trỏ đến một chức năng khác. Sử dụng con trỏ nguyên gốc, chức năng can thiệp sẽ không cần phải có quyền truy cập vào định nghĩa của lớp, nhưng bằng cách sử dụng smart_ptr, nó xuất hiện. Có cách nào để tránh điều này?
Ví dụ, với một hàm mục tiêu:
void func(shared_ptr<SomeClass> const & obj)
Các const &
sẽ chăm sóc của một phần của vấn đề, nhưng nói rằng chúng ta có một lớp getter mà có được đối tượng đối với một số lớp khác, như:
shared_ptr<SomeClass> someClassInstance();
và đây là nơi mà tôi muốn chỉ đơn giản là lắp ráp các đối số và chuyển tiếp đến chức năng mục tiêu:
func(someClassInstance());
Với một con trỏ đơn giản, điểm này trong mã có thể chỉ đơn giản sử dụng một khai báo chuyển tiếp SomeClass
, nhưng với một smart_ptr
nó cần phải có định nghĩa đầy đủ (có lẽ là smart_ptr có thể cần phải xóa lớp).
Bây giờ, nếu someClassInstance
phải trả lại const &
vấn đề này sẽ thực sự biến mất khi mã can thiệp sẽ không sao chép bất kỳ đối tượng nào. Tuy nhiên, chức năng getter phải trả lại bản sao vì lý do an toàn chủ đề.
Có cách nào tôi có thể đạt được kiểu chuyển tiếp tham số con trỏ thông minh này mà không cần định nghĩa lớp? Đó là, tôi có thể sử dụng con trỏ thông minh trong cùng một thời trang như tôi sẽ là một con trỏ truyền thống trong trường hợp này.
-
CẬP NHẬT: Viết một thử nghiệm nhỏ câu trả lời là chính xác rằng một tuyên bố về phía trước là đủ. Tuy nhiên, GCC vẫn phàn nàn trong một tình huống. Tôi sẽ phải tìm ra chính xác những gì gây ra nó thất bại (trong tình huống cụ thể này).
Tôi có đóng câu hỏi này ngay bây giờ hay không?
Tại sao bạn muốn chuyển một 'shared_ptr' theo tham chiếu? Có thể tham chiếu đến loại bê tông đủ không? Ngoài ra bạn có một số loại quan niệm sai lầm, 'shared_ptr' không yêu cầu định nghĩa đầy đủ của loại được truyền xung quanh, nó hoạt động với các loại không đầy đủ. –
bạn không thể tạo mẫu 'func'? – Nim
Tôi chỉ cố gắng vượt qua tham chiếu để tránh sự cố (nó giúp trong một số trường hợp). Tôi đoán tôi cần phải cô lập tình hình tốt hơn trong đó nó không hoạt động. –