2010-12-13 2 views
7

La funzione getline ha un character version che è una funzione membro, nonché un global version che accetta stringhe. Perché non sono entrambe funzioni membro? Il modo attuale fa sembrare che non ci sia una versione di stringa.Perché la versione stringa di getline è una funzione non membro?

+0

Mentre all'inizio potrebbe essere controintuitivo, ci sono autori che supportano l'idea che il modo più orientato agli oggetti di aggiungere funzionalità a una classe sia tramite funzioni libere. Leggi questo [Guru Of the Week # 84] (http://www.gotw.ca/gotw/084.htm). La domanda potrebbe trasformarsi in, * perché alcune funzioni membro della libreria esistenti non sono funzioni libere? * –

risposta

5

istream& istream::getline(char* s, streamsize n) fa parte dell'interfaccia di flusso.

istream& getline(istream& is, string& str) è un metodo diestensione dalla biblioteca string (proprio come il istream &operator>>(istream&, string&)).

Questo disegno è stato probabilmente scelto al fine di slegare iostreams da stringa, come fstream::open() inoltre non prendere std::string argomenti ma piuttosto const char*.

2

Poiché l'implementazione delle classi iostream non deve dipendere dalle stringhe.

1

Il problema con la libreria di flusso è che non è ben progettato. In particolare, la funzione membro getline non dovrebbe esserci affatto. La funzione gratuita getline è quella giusta da usare, ha diversi vantaggi: non è una funzione membro, è sicura, non funziona su buffer raw e non richiede alcuna congettura.

È necessario ricordare che entrambe le funzioni membro e gratuite fanno parte dell'interfaccia pubblica di instream.