2010-12-13 10 views
7

La función getline tiene un character version que es una función miembro, así como un global version que toma cadenas. ¿Por qué no son ambas funciones miembro? La forma actual hace que parezca que no hay una versión de cadena.¿Por qué la versión de cadena de getline es una función no miembro?

+0

Si bien puede ser contra intuitivo al principio, hay autores que respaldan la idea de que la forma más orientada a objetos de agregar funcionalidad a una clase es a través de funciones gratuitas. Lea este [Gurú de la semana # 84] (http://www.gotw.ca/gotw/084.htm). La pregunta podría convertirse en * ¿por qué algunas de las funciones de miembros de la biblioteca no son funciones gratuitas? * –

Respuesta

5

istream& istream::getline(char* s, streamsize n) es parte de la interfaz de transmisión.

istream& getline(istream& is, string& str) es un método extensión desde la string biblioteca (al igual que el istream &operator>>(istream&, string&)).

Este diseño probablemente fue elegido con el fin de desacoplar iostreams de cadena, como también fstream::open() no toma std::string argumentos, sino más bien const char*.

2

Porque la implementación de las clases iostream no debe depender de las cadenas.

1

El problema con la biblioteca de secuencias es que no está bien diseñado. En particular, la función miembro getline no debería estar allí en absoluto. La función gratuita getline es la correcta para usar, tiene varias ventajas: no es una función de miembro, es segura, no funciona en búferes crudos, y no requiere conjeturas.

Es necesario mencionar que las funciones gratuitas y de miembro forman parte de la interfaz pública de istream.

Cuestiones relacionadas