OVH Cloud OVH Cloud

Objet sans constructeur par defaut et lecture fichier

5 réponses
Avatar
Marc Boyer
Bonjour,

une question de design: soit une classe C qui ne possède
pas de constructeur sans paramètre. Comment créer une
telle variable à partir d'un flux d'entrée (fichier).

J'hésite en une méthode statique:
C readC(std::istream&);
et un constructeur (explicite)
C(std::istream&);

En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...

Des idées ? Du temps à perdre sur fclc++ ?

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

5 réponses

Avatar
Loïc Joly
Bonjour,

une question de design: soit une classe C qui ne possède
pas de constructeur sans paramètre. Comment créer une
telle variable à partir d'un flux d'entrée (fichier).

J'hésite en une méthode statique:
C readC(std::istream&);
et un constructeur (explicite)
C(std::istream&);

En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...

Des idées ? Du temps à perdre sur fclc++ ?


La bibliothèque de sérialisation de boost résoud cette question en
exigeant la présence d'un constructeur par défaut, quitte à ce qu'il
soit privé avec la classe de sérialisation comme seule amie.

--
Loïc

Avatar
Marc Boyer
Loïc Joly wrote:
En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...

Des idées ? Du temps à perdre sur fclc++ ?


La bibliothèque de sérialisation de boost résoud cette question en
exigeant la présence d'un constructeur par défaut, quitte à ce qu'il
soit privé avec la classe de sérialisation comme seule amie.


Constructeur privé ou absent, je ne vois pas trop la différence
dans l'interface.
Mais donc, ils partent sur l'idée d'une fabrique de C à partir
d'une autre classe amie.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Laurent Deniau
Marc Boyer wrote:
Bonjour,

une question de design: soit une classe C qui ne possède
pas de constructeur sans paramètre. Comment créer une
telle variable à partir d'un flux d'entrée (fichier).

J'hésite en une méthode statique:
C readC(std::istream&);
et un constructeur (explicite)
C(std::istream&);


si tu veux que ce soit explicite, utilise explicit ;-)

En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...


Je prefere aussi le constructeur.

Des idées ? Du temps à perdre sur fclc++ ?


J'utilise des formateurs. Il s'occupe de contruire des classes associees
a partir du contenu du fichier. Moi non plus je n'aime pas melanger
les E/S avec le reste.

a+, ld.

Avatar
Marc Boyer
Laurent Deniau wrote:
une question de design: soit une classe C qui ne possède
pas de constructeur sans paramètre. Comment créer une
telle variable à partir d'un flux d'entrée (fichier).

J'hésite en une méthode statique:
C readC(std::istream&);
et un constructeur (explicite)
C(std::istream&);


si tu veux que ce soit explicite, utilise explicit ;-)


Taquin va.

En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...


Je prefere aussi le constructeur.

Des idées ? Du temps à perdre sur fclc++ ?


J'utilise des formateurs. Il s'occupe de contruire des classes associees
a partir du contenu du fichier. Moi non plus je n'aime pas melanger
les E/S avec le reste.


En fait, comme c'est un petit projet jetable et que j'ai renoncé
à sortir l'artillerie de la classe de sérialisation / formateur,
ça ne peut pas être complètement joli.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Marc Boyer
Marc Boyer wrote:
une question de design: soit une classe C qui ne possède
pas de constructeur sans paramètre. Comment créer une
telle variable à partir d'un flux d'entrée (fichier).

J'hésite en une méthode statique:
C readC(std::istream&);
et un constructeur (explicite)
C(std::istream&);

En fait, le constructeur me semble la meilleure solution,
mais quelque chose me chagrine, un vieux réflexe de séparer
le coeur des traitements des E/S...


Je me réponds à moi même: le constructeur n'est pas du tout
pratique.
D'abord, si on stoque des C les uns à la suite des autres
dans un flux, il devient difficile de gérer la fin de fichier.
Ensuite, si on essaye de faire de la composition (des C membres
d'une autre classe X), ça devient touffu.

class C {
public:
C(std::istream&);
}

class X {
private:
C c1, c2;
public:
X(std::istream& s):c1(s),c2(s){};
}

Avec l'ordre d'évaluation des constructeurs dépendant de la déclaration
dans X...

Non, c'était pas une bonne idée...

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.