2011-01-09 14 views
5

Quelli di noi che hanno visto la bellezza di STL tenta di utilizzarlo il più possibile, e anche incoraggiare gli altri ad usarlo ovunque li vediamo utilizzando puntatori prime e array. Scott Meyers ha scritto un intero libro su STL, con il titolo Effective STL. Eppure quello che è successo agli sviluppatori di ifstream che hanno preferito char* su std::string. Mi chiedo perché il primo parametro di ifstream::open() sia di tipo const char*, anziché const std::string &. Si prega di dare un'occhiata alla sua firma:Progettazione di classe std :: ifstream

void open(const char * filename, ios_base::openmode mode = ios_base::in); 

Perché questo? Perché non questo:

void open(const string & filename, ios_base::openmode mode = ios_base::in); 

Si tratta di un errore grave con il progetto? O questo design è intenzionale? Quale potrebbe essere la ragione? Non vedo alcun motivo per cui hanno preferito char* su std::string. Nota potremmo ancora passare char* a quest'ultima funzione che prende std::string. Non è un problema!

A proposito, sono a conoscenza del fatto che ifstream è un typedef, quindi nessun commento sul mio titolo.:P. Sembra poco per questo l'ho usato.

Il modello di classe reale è:

template<class _Elem,class _Traits> class basic_ifstream; 
+0

L'unica cosa che i flussi hanno in comune con l'STL è che entrambi fanno parte della lib di std. __Standard library! = STL .__ – sbi

risposta

4

My copy of the standard non è d'accordo con te. Si dice sia questi sono sovraccarichi:

void open(const char* s, ios_base::openmode mode = ios_base::in); 
void open(const string& s, ios_base::openmode mode = ios_base::in); 

Tuttavia, questa copia dello standard è una bozza della prossima versione dello standard, C++ 0x.

La ragione di questo è che la biblioteca iostreams precede std::basic_string, e perché i progettisti della libreria non volevano qualcuno con cui avere a #include <string> e tutti i suoi altri bagagli associato se non volevano usarlo.

+3

Probabilmente stai guardando una bozza C++ 0X. – AProgrammer

+0

@AProgrammer: Hmm .. non sapeva che questo è stato cambiato. Aggiunto un link alla copia che sto usando per renderlo più chiaro. –

+2

@Billy ONeal: non è C++ 03. Sto parlando di C++ 03. – Nawaz

7

Perché iostream è stata progettata molto prima parte del STL è stato integrato nella libreria standard. E la classe della corda è stata creata dopo. Era piuttosto tardi nel processo di standardizzazione e la modifica di IOStream non era considerata salvata.

BTW, come parte delle modifiche minori ma convenienti in C++ 0X, si è verificata una pulizia di questo tipo di cose.

0

E 'in genere non più costoso per ottenere una stringa C da un std::string quello che è di costruire un std::string da una stringa C così, dato che si rischia di voler utilizzare std::ifstream con nomi di file che provengono da entrambi, utilizzando un const char* nell'interfaccia non è un costo significativo.

Si tratta di un errore grave del progetto?

Cosa non si può fare con l'interfaccia corrente? Quale vantaggio concreto e significativo prenderebbe un const std::string& nell'interfaccia?

Il vero vantaggio di un sovraccarico di std::string, a mio avviso, è di aiuto ai principianti che facilitano il corretto funzionamento quando si tenta di utilizzare std :: string e gli stream insieme. Per gli sviluppatori C++ esperti, il costo insignificante di scrivere .c_str() quando necessario è probabilmente trascurabile rispetto al resto dello sforzo che va a sviluppare codice.

+0

@Charles Bailey: sembra una razionalizzazione post-facto. : P – Nawaz

+0

@Nawaz: Che cosa stai chiedendo se non la razionalizzazione dopo il fatto (dato che l'interfaccia attuale è già stata standardizzata)? –

+0

@Charles Bailey: Voglio dire, se avessero preferito 'std :: string' su' char * ', avresti detto la stessa cosa. Solo in ordine inverso. E sembrerebbe ancora logico.: | ... mentre la mia domanda riguardava il motivo per cui essi stessi non usavano std :: string se non ci sono danni. – Nawaz

Problemi correlati