2012-04-11 9 views
5

Tôi tò mò về cách fstreamclass có thể trả lại giá trị true hoặc false bằng cách chỉ cần đặt tên của đối tượng bên trong câu lệnh có điều kiện. Ví dụ:Làm thế nào nếu ('đối tượng fstream') trả về giá trị true hoặc false tùy thuộc vào việc tệp đã được mở hay chưa?

std::fstream fileStream; 
fileStream.open("somefile.ext"); 

if (!fileStream) // How does this work? 
    std::cout << "File could not be opened...\n"; 

Tôi hỏi điều này vì tôi muốn lớp của riêng tôi trả về giá trị nếu tôi sử dụng nó theo cách tương tự.

+3

Đây được gọi là [thành ngữ an toàn-bool] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool), và không nên được sử dụng trong mã C++ 11 mới có lợi cho 'toán tử trừu tượng bool()'. – ildjarn

+0

Đúng vậy. Tôi hoàn toàn quên mất điều này. Tôi không thể đánh dấu nhận xét của bạn là câu trả lời nhưng cảm ơn! –

Trả lời

5

Nó không thực sự là nó bằng true hoặc false, mà là nó quá tải toán tử ! để trả về trạng thái của nó.

Xem http://www.cplusplus.com/reference/iostream/ios/operatornot/ để biết chi tiết.

Tự làm việc này rất đơn giản, hãy xem operator overloading faq hoặc C++ Operator Overloading Guidelines.

Chỉnh sửa: Nó được chỉ ra cho tôi rằng ios cũng quá tải toán tử chuyển đổi void *, trả về một con trỏ rỗng trong trường hợp lỗi. Vì vậy, bạn cũng có thể sử dụng phương pháp đó, cũng được đề cập trong faq đã đề cập trước đó.

+0

oh, rõ ràng là tôi có thể kiểm tra cái này của tôi, nhưng bạn đang nói rằng nếu tôi gõ nếu (fileStream) sẽ không hoạt động theo cùng một cách? –

+2

Nó không quá tải 'toán tử!', Nó sử dụng toán tử chuyển đổi 'toán tử bool' – bames53

+0

@ bames53 Thật sao? Tôi luôn nghĩ đó chỉ là nhà điều hành không (tất nhiên tôi có thể sai). Bạn có một liên kết đến một tài liệu nói rằng? – jli

3

Công trình này sử dụng toán tử chuyển đổi. Lưu ý rằng cách dường như rõ ràng, chuyển đổi sang bool, đã ngoài ý muốn tác dụng phụ, do đó một chuyển đổi sang một built-in loại với chuyển đổi ngầm để bool nên được sử dụng, ví dụ:

class X 
{ 
public: 
    void some_function(); // this is some member function you have anyway 
    operator void(X::*)() const 
    { 
    if (condition) 
     return &X::some_function; // "true" 
    else 
     return 0; // "false" 
    } 
}; 

Trong C++ 11, bạn có thể thực hiện chuyển đổi thành bool rõ ràng và do đó tránh các tác dụng phụ không mong muốn. Vì vậy, trong C++ 11 bạn có thể chỉ cần viết:

class X 
{ 
public: 
    explicit operator bool() const 
    { 
    return condition; 
    } 
}; 
+0

Cảm ơn bạn đã giải thích. Cùng với những người khác, tất cả đều có ý nghĩa. –