2012-04-11 12 views
5

Tengo curiosidad por cómo el fstreamclass puede devolver un valor true o false simplemente colocando el nombre del objeto dentro de una declaración condicional. Por ejemplo ...¿Cómo devuelve if ('fstream object') un valor verdadero o falso dependiendo de si el archivo fue abierto?

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

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

Pregunto esto porque quiero que mi propia clase devuelva un valor si lo uso de una manera similar.

+3

Esto se conoce como el [seguro-bool idioma] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool), y no debería usarse en el nuevo código C++ 11 a favor de 'operador explícito bool()'. – ildjarn

+0

Eso es correcto. Me había olvidado por completo de esto. No puedo marcar su comentario como la respuesta, ¡pero gracias! –

Respuesta

5

No es realmente que es igual a verdadero o falso, sino más bien que se sobrecarga el operador ! para volver a su estado.

Ver http://www.cplusplus.com/reference/iostream/ios/operatornot/ para los detalles.

Hacer esto usted mismo es muy simple, consulte operator overloading faq o C++ Operator Overloading Guidelines.

Editar: Se ha señalado a mí que ios también sobrecarga el operador de conversión void *, devolviendo un puntero nulo en el caso de un fracaso. Entonces también podría usar ese enfoque, también cubierto en las preguntas frecuentes mencionadas anteriormente.

+0

oh, obviamente podría probar esto yo mismo, pero estás diciendo que si tuviera que escribir if (fileStream) ¿eso no funcionaría de la misma manera? –

+2

No sobrecarga 'operator!', Utiliza un operador de conversión 'operator bool' – bames53

+0

@ bames53 ¿En serio? Siempre pensé que era solo el operador no (por supuesto, podría estar equivocado). ¿Tiene un enlace a un documento que dice eso? – jli

3

Esto funciona mediante un operador de conversión. Tenga en cuenta que la forma aparentemente obvio, la conversión a bool, ha efectos no deseados secundarios, por lo tanto, una conversión a un tipo incorporado con la conversión implícita a bool debe usarse, por ejemplo:

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" 
    } 
}; 

En C++ 11 que, puede hacer explícita la conversión a bool, y así evitar los efectos secundarios no deseados. Así, en C++ 11 simplemente hay que escribir:

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

Gracias por la explicación. Junto con los demás, todo tiene sentido. –

Cuestiones relacionadas