2012-04-23 28 views
10

Tôi thường sử dụng phía trước tuyên bố chủ yếu, nếu tôi có một lớp học mà không cần định nghĩa hoàn chỉnh trong tập tin .hppForward Tuyên bố của các biến/classes trong namespace std

Ex)

//B.hpp 

namespace A_file { 
    class A; 
} 

namespace B_file { 

    class B { 
    public: 
     B(); 
    private: 
     A *ptr_to_A; 
    } 
} 

//B.cpp 

#include "A.hpp" 
using namespace A_file; 

namespace B_file { 

    B(int value_) { 
     *ptr_to_A = new A(value_); 
    } 

    int some_func() { 
     ptr_to_A->some_func_in_A(); 
    } 
} 

tôi viết này loại mã. Tôi nghĩ rằng, nó sẽ tiết kiệm bao gồm toàn bộ hpp một lần nữa. (Cảm thấy tự do để bình luận, nếu bạn điều, điều này là không lành mạnh)

Có cách nào mà tôi có thể làm tương tự cho các đối tượng/lớp trong không gian tên std? Nếu có cách nào, liệu có ổn hay không có tác dụng phụ không?

Trả lời

20

Bạn có thể chuyển tiếp khai báo lớp của riêng mình trong tệp tiêu đề để tiết kiệm thời gian biên dịch. Nhưng bạn không thể cho các lớp trong không gian tên std. Theo tiêu chuẩn C++ 11, 17.6.4.2.1:

Hành vi của một chương trình C++ là undefined nếu nó thêm tờ khai hoặc định nghĩa để namespace std hoặc một không gian tên trong namespace std trừ trường hợp quy định .

Lưu ý rằng một số lớp này là kiểu chữ của lớp được tạo khuôn mẫu, do đó, một khai báo chuyển tiếp đơn giản sẽ không hoạt động. Bạn có thể sử dụng #include<iosfwd> thay vì #include<iostream> ví dụ, nhưng không có tiêu đề tương tự với chỉ về phía trước tờ khai cho string, vector vv

Xem GotW #34, Forward Declarations để biết thêm thông tin.

+2

+1. Dự đoán đủ, tiền lệ được đặt bởi '' cũng là phương pháp hay nhất: thích có thêm tiêu đề khai báo bổ sung, được bao gồm bởi tiêu đề "bình thường" để kiểm tra thời gian biên dịch cho hiệu lực liên tục và bởi khách hàng chỉ cần khai báo chuyển tiếp . Nó phải "sống" và được duy trì với thư viện có mã chuyển tiếp tuyên bố, chứ không phải mã khách hàng! Lý do chính xác được đưa ra trong các GotW trên ổ đĩa này: cấu trúc có thể trở thành typedefs của mẫu, mẫu có thể thêm đối số vv .. –