2010-07-02 43 views
8

Tôi đang cố gắng để chặn truy cập vào constructor mặc định của một lớp tôi đang viết. Hàm tạo mà tôi muốn người khác sử dụng yêu cầu tham chiếu const đến một đối tượng khác. Tôi đã đặt hàm tạo mặc định là riêng tư để ngăn người khác sử dụng nó. Tôi nhận được một lỗi trình biên dịch cho constructor mặc định vì biến thành viên tham chiếu const không được khởi tạo đúng cách. Tôi có thể làm gì để biên dịch?const tham chiếu phải được khởi tạo trong constructor cơ sở/thành viên initializer danh sách

class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 
}; 

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar() // I am getting a compiler error because I don't know what to do with fooReference here... 
    { 
    } 
}; 

Trả lời

12

không khai báo hàm tạo mặc định. Nó không sẵn có (tự động là nó) nếu bạn khai báo hàm tạo của riêng bạn.

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 
private: 
    const CFoo& fooReference; 
}; 

lời giải thích khá đầy đủ các nhà xây dựng có thể được tìm thấy ở đây: http://www.parashift.com/c++-faq-lite/ctors.html

+1

Cảm ơn sự giúp đỡ của bạn. Đối với một số lý do, tôi nghĩ rằng trình biên dịch tạo ra một constructor mặc định ngay cả khi tôi đã không viết một. –

+2

@Trevor Nó có, miễn là bạn không khai báo rõ ràng một hàm tạo (thuộc bất kỳ loại nào) trong định nghĩa lớp của bạn. –

+2

@Trevor Bạn cũng có thể cần chặn trình tạo bản sao. – rwong

4

Cách đơn giản nhất để tạo ra các constructor mặc định bạn không sử dụng muốn (đó là trường hợp với nhà xây dựng của bạn, không biết có đúng?) chỉ là không xác định nó, đó là:

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar(); 
}; 

Trong trường hợp này, nó có thể là một chút dư thừa, bởi vì trình biên dịch sẽ không tạo ra một constructor mặc định cho một lớp học với thành viên tham khảo, nhưng nó tốt hơn để đặt nó ở đó trong trường hợp bạn xóa thành viên tham chiếu.

Các vấn đề liên quan