Tôi đang viết đây là một câu trả lời riêng biệt thay vì chỉ là một nhận xét vì tôi không đồng ý với câu trả lời của Luc Touraille, không phải vì lý do hợp pháp mà là phần mềm mạnh mẽ và nguy cơ giải thích sai.
Cụ thể, tôi có một vấn đề với hợp đồng ngụ ý về những gì bạn mong muốn người dùng giao diện của bạn phải biết.
Nếu bạn đang quay lại hoặc chấp nhận các loại tham chiếu, thì bạn chỉ nói rằng họ có thể chuyển qua một con trỏ hoặc tham chiếu mà họ có thể chỉ biết đến thông qua một tuyên bố chuyển tiếp.
Khi bạn trả về một loại không đầy đủ X f2();
thì bạn đang nói rằng người gọi của bạn phải có đặc điểm kỹ thuật loại đầy đủ của X. Họ cần nó để tạo LHS hoặc đối tượng tạm thời tại trang web cuộc gọi.
Tương tự, nếu bạn chấp nhận một loại không đầy đủ, người gọi phải xây dựng đối tượng là tham số. Ngay cả khi đối tượng đó được trả về dưới dạng một kiểu không hoàn chỉnh khác từ một hàm, trang web cuộc gọi cần khai báo đầy đủ. I E:
class X; // forward for two legal declarations
X returnsX();
void XAcceptor(X);
XAcepptor( returnsX() ); // X declaration needs to be known here
Tôi nghĩ có một nguyên tắc quan trọng là một tiêu đề sẽ cung cấp đủ thông tin để sử dụng nó mà không cần phụ thuộc vào các tiêu đề khác. Điều đó có nghĩa là tiêu đề sẽ có thể được bao gồm trong một đơn vị biên dịch mà không gây ra lỗi trình biên dịch khi bạn sử dụng bất kỳ chức năng nào mà nó khai báo.
Ngoại trừ
Nếu phụ thuộc bên ngoài này là hành vi mong muốn . Thay vì sử dụng trình biên dịch có điều kiện, bạn có thể có một yêu cầu được ghi chép rõ ràng để họ cung cấp tiêu đề khai báo X. Đây là cách thay thế cho việc sử dụng #ifdefs và có thể là một cách hữu ích để giới thiệu giả hoặc các biến thể khác.
Sự khác biệt quan trọng là một số kỹ thuật mẫu mà bạn rõ ràng KHÔNG mong muốn khởi tạo chúng, được đề cập chỉ để ai đó không bị ngớ ngẩn với tôi.