Tôi có các đối tượng tạo các đối tượng con khác trong các hàm tạo của chúng, chuyển 'this this' để con có thể lưu một con trỏ trở lại con trỏ của nó. Tôi sử dụng boost :: shared_ptr rộng rãi trong chương trình của tôi như là một thay thế an toàn hơn cho std :: auto_ptr hoặc raw pointers. Vì vậy, đứa trẻ sẽ có mã như shared_ptr<Parent>
, và tăng cung cấp các phương pháp shared_from_this()
mà cha mẹ có thể cung cấp cho đứa trẻ.Làm thế nào để xử lý con trỏ 'này' trong hàm tạo?
Vấn đề của tôi là shared_from_this()
không thể được sử dụng trong một hàm tạo, điều này không thực sự là một tội phạm bởi vì 'điều này' không nên được sử dụng trong một nhà xây dựng, trừ khi bạn biết bạn đang làm gì và không quan tâm đến những hạn chế .
Hướng dẫn kiểu C++ của Google states rằng các nhà xây dựng chỉ nên đặt biến thành viên thành giá trị ban đầu của chúng. Bất kỳ khởi tạo phức tạp nào cũng nên đi theo phương thức Init() rõ ràng. Điều này giải quyết vấn đề 'này-trong-constructor' cũng như một vài người khác là tốt.
Điều làm phiền tôi là những người sử dụng mã của bạn bây giờ phải nhớ gọi Init() mỗi khi họ xây dựng một trong các đối tượng của bạn. Cách duy nhất tôi có thể nghĩ đến để thực thi điều này là bằng cách xác nhận rằng Init() đã được gọi ở đầu mỗi hàm thành viên, nhưng điều này là tẻ nhạt để viết và rườm rà để thực thi.
Có thành ngữ nào ở đó giải quyết vấn đề này ở bất kỳ bước nào trên đường đi không?
Google đã sai. Có một chủ đề khổng lồ về điều này và các bài viết ngắn khác về hướng dẫn về phong cách của họ trên comp.lang.C++. Lý do cơ bản cho họ đến với điều này là bởi vì họ cũng (sai) cấm ngoại lệ. –
@Neil: Ấn tượng mà tôi nhận được là Google đã được trao tay nặng với hướng dẫn phong cách để chứa những người không biết rõ C++, cố gắng hạn chế thiệt hại mà họ có thể làm hoặc có thể thực thi tính đồng nhất với mã cũ. Google có thể có lý do chính đáng cho hướng dẫn về phong cách của họ, nhưng nó không phải là một mô hình tốt cho bất kỳ ai khác để sao chép. –
@David Đúng vậy. Nhưng mọi người có thể bị nhầm lẫn khi sử dụng các số dấu phẩy động (xem tất cả các câu hỏi ở đây về chủ đề) hoặc thậm chí là số nguyên, nhưng chúng tôi không cấm sử dụng chúng. Đây là một trong những lý do tôi không có fan hâm mộ của phong cách hướng dẫn. –