35 votes

Pourquoi les classes std :: fstream ne prennent-elles pas une chaîne std ::?

Ce n'est pas une question de conception, vraiment, même si cela peut sembler. (Eh bien, d'accord, c'est une sorte de question de conception). Ce que je me demande, c'est pourquoi les classes C ++ std::fstream ne prennent pas std::string dans leur constructeur ou leurs méthodes ouvertes. Tout le monde aime les exemples de code:

 #include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::string filename = "testfile";      
    std::ifstream fin;

    fin.open(filename.c_str()); // Works just fine.
    fin.close();

    //fin.open(filename); // Error: no such method.
    //fin.close();
}
 

Cela me donne tout le temps lorsque je travaille avec des fichiers. La bibliothèque C ++ utiliserait sûrement std::string autant que possible?

26voto

wilhelmtell Points 25504

En prenant une chaîne C, le C++03 std::fstream classe de réduire la dépendance sur l' std::string classe. En C++11, cependant, l' std::fstream classe ne permettent le passage d'un std::string de son paramètre de constructeur.

Maintenant, vous demandez peut-être pourquoi il n'existe pas de conversion transparentes à partir d'un std:string d'une chaîne C, donc une classe qui s'attend à une chaîne C pourrait encore prendre un std::string tout comme une classe qui s'attend à un std::string pouvez prendre une chaîne C.

La raison en est que ce serait la cause d'un cycle de conversion, qui à son tour peut conduire à des problèmes. Par exemple, supposons std::string seraient convertibles à une chaîne C de sorte que vous pouvez utiliser std::strings avec fstreams. Supposons aussi que C de la chaîne sont convertibles std::strings est l'état dans la norme actuelle. Maintenant, considérez les points suivants:

void f(std::string str1, std::string str2);
void f(char* cstr1, char* cstr2);

void g()
{
    char* cstr = "abc";
    std::string str = "def";
    f(cstr, str);  // ERROR:  ambiguous
}

Parce que vous pouvez convertir entre une std::string et une chaîne C de l'appel à f() pourraient résoudre à l'une des deux f() alternatives, et est donc ambigu. La solution est de briser le cycle de conversion en faisant un sens de conversion explicite, qui est ce que la STL a choisi de le faire avec c_str().

14voto

Christopher Points 6688

Il existe plusieurs endroits où le comité standard C ++ n'a pas vraiment optimisé l'interaction entre les installations de la bibliothèque standard.

std::string et son utilisation dans la bibliothèque en fait partie.

Un autre exemple est std::swap . De nombreux conteneurs ont une fonction membre swap, mais aucune surcharge de std :: swap n'est fournie. Il en va de même pour std::sort .

J'espère que toutes ces petites choses seront corrigées dans la prochaine norme.

11voto

Pieter Points 9200

C'est peut-être une consolation: tous les fstream ont obtenu un open (string const &, ...) à côté de l'open (char const *, ...) dans le brouillon de travail de la norme C ++ 0x. (voir par exemple 27.8.1.6 pour la déclaration basic_ifstream)

Donc, quand il sera finalisé et implémenté, il ne vous obtiendra plus :)

9voto

Drealmer Points 2284

La bibliothèque IO de flux a été ajoutée à la bibliothèque C ++ standard avant la STL. Afin de ne pas rompre la compatibilité descendante, il a été décidé d'éviter de modifier la bibliothèque d'E / S lors de l'ajout de la STL, même si cela signifiait certains problèmes comme celui que vous posez.

3voto

swmc Points 51

@ Bernard:
Monolithes "non cordés". "Tous pour un et un pour tous" peut fonctionner pour les mousquetaires, mais cela ne fonctionne pas aussi bien pour les concepteurs de classe. Voici un exemple qui n'est pas tout à fait exemplaire, et il illustre à quel point vous pouvez vous tromper lorsque le design se transforme en overdesign. L'exemple est malheureusement tiré d'une bibliothèque standard près de chez vous ... ~ http://www.gotw.ca/gotw/084.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X