Chỉ là một câu hỏi khái niệm mà tôi đã gặp phải. Trong dự án hiện tại của tôi, có vẻ như tôi đang sử dụng quá mức các thư viện tăng smart_ptr
và ptr_container
. Tôi đã tạo boost::ptr_vectors
trong nhiều đối tượng khác nhau và gọi phương thức transfer() để di chuyển một số con trỏ nhất định từ một số boost::ptr_vector
sang một đối tượng khác.Nên tăng :: ptr_vector được sử dụng tại chỗ std :: vector tất cả các thời gian?
Đó là sự hiểu biết của tôi rằng điều quan trọng là phải thể hiện rõ ràng quyền sở hữu đối tượng được phân bổ heap.
Câu hỏi của tôi là, muốn sử dụng các thư viện tăng này để tạo các thành viên phân bổ heap thuộc về đối tượng nhưng sau đó sử dụng con trỏ bình thường cho các thành viên này qua get()
khi thực hiện bất kỳ xử lý nào.
Ví dụ: Trò chơi có thể có một bộ sưu tập Gạch thuộc về nó. Nó có thể có ý nghĩa để tạo ra các gạch trong một boost::ptr_vector
. Khi trò chơi kết thúc, các ô này sẽ tự động được giải phóng.
Tuy nhiên nếu tôi muốn đặt những gạch trong một đối tượng Bag tạm thời, tôi nên tạo một boost::ptr_vector
trong túi và chuyển gạch của game đến Bag qua transfer()
hoặc tôi nên tạo một nơi tham khảo std::vector<Tile*>
các 's gạch * các Gạch trong Trò chơi và chuyển nó cho Túi?
Cảm ơn.
** Chỉnh sửa Tôi nên chỉ ra rằng trong ví dụ của tôi Trò chơi sẽ có đối tượng Túi làm thành viên. Túi sẽ chỉ được lấp đầy với Gạch trò chơi sở hữu. Vì vậy, túi sẽ không tồn tại mà không có trò chơi.
tại sao đối tượng của bạn lại được phân bổ ở vị trí đầu tiên? Đó là nơi chuông báo động đầu tiên xuất hiện với tôi. 'ptr_vector' là một giải pháp tuyệt vời trong các trường hợp * hiếm hoi * khi bạn cần lưu trữ các con trỏ tới các đối tượng được cấp phát đống. Nhưng nếu những trường hợp đó không (rất) hiếm, thì bạn đang làm sai. ;) Nếu trò chơi có bộ sưu tập Gạch, hãy đặt * chúng * trong vectơ. Đừng đặt con trỏ vào chúng. – jalf
Các câu trả lời cho câu hỏi này khá lạc hậu nếu bạn có một C++ 11 thực hiện. Ví dụ, không có lý do gì cả cho các lớp ptr_x trong C++ 11. Các thùng chứa tiêu chuẩn chỉ yêu cầu nội dung của chúng có thể di chuyển được, có nghĩa là các thùng chứa ':: std :: unique_ptr' là cách để thực hiện điều này. – Omnifarious
@jalf Tôi đang bối rối. Vì vậy, nếu tôi phải điền một vector của một đối tượng phức tạp (nói từ một tập tin), tôi không nên luôn luôn phân bổ nó trên heap? Nếu tôi không phân bổ nó trong heap, đối tượng phải được sao chép và toàn bộ đối tượng sẽ được sao chép vào vectơ. Vì vậy, nếu tôi làm theo chính xác, nó thường tốt hơn để chịu chi phí của bản sao hơn để sử dụng shared_ptr, phải không? Và thông thường bạn sẽ chỉ muốn sử dụng ptr_container nếu đối tượng không thể sao chép được? – Jerahmeel