Tôi có mã hiện tại nơi họ có một lớp và một phương thức khởi tạo trong lớp đó. Dự kiến một khi đối tượng của lớp được tạo, họ cần gọi khởi tạo trên nó.
Lý do tại sao phương thức khởi tạo tồn tại Đối tượng được tạo sớm để có phạm vi toàn cục và sau đó phương thức khởi tạo sẽ được gọi sau khi tải một dll mà nó phụ thuộc vào.
Vấn đề với việc khởi tạo Lớp bây giờ có bool isInitialized này cần được kiểm tra trong mọi phương thức trước khi nó tiến hành và trả về lỗi nếu nó không được khởi tạo. Nói một cách đơn giản, đó là một nỗi đau lớn.
Một giải pháp có thể Khởi tạo trong hàm tạo. Chỉ có một con trỏ đến đối tượng trong phạm vi toàn cầu. Tạo đối tượng thực tế sau khi dll được tải.
Vấn đề với giải pháp trên Bất cứ ai tạo ra một đối tượng của lớp này cần biết rằng nó chỉ cần được tạo sau khi dll được tải nếu không nó sẽ thất bại.
điều này có chấp nhận được không?
call_once
trong C ++ 11 . Các dự án chưa có trên C ++ 11 nên nghiên cứu cách thực hiện call_once trong C ++ 11 (tập trung vào vấn đề mà nó giải quyết, và sau đó như thế nào), sau đó triển khai lại theo hương vị (cũ) của C ++. Nó cần một nguyên thủy đồng bộ hóa đa luồng an toàn, có trạng thái cần được khởi tạo tĩnh (với giá trị không đổi). Lưu ý rằng trình biên dịch trước C ++ 11 có thể có các đặc điểm riêng cần được thỏa mãn.