Accueil > > > INITIALISATION D'OBJET VIA UN STREAM
INITIALISATION D'OBJET VIA UN STREAM
Information sur la source
Description
Voila, c'est mon premier code en C++, alors lachez vous pour toutes remarques, apparemment je devrais pouvoir me passer des methodes membre en "friend". Pour le prog en lui-même, Il sert juste a initialiser des objets d'après un fichier de configuration.
Source
- /*
- //======= SAMPLE DU FICHIER DE CONFIGURATION =============
- * bla bla bla
- * bla bla
- chab01 0x0000 16777000
- dball39 0 16776999
- hour26 0x0015 16776992
- erfe27 0x001a 16777000
- //=============== Fin Du sample ============
- //=============== debut du code =========== */
-
- /* ***********************************************
- class BDU
- BDU.Cpp
- *************************************************** */
-
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <sstream>
- using namespace std;
- class Bdu{
- // Ces deux methodes sont déclarées en friend car elle accèdent directement
- //,notemment la deuxième, au membre privée de la classe, une autre solution
- // est possible mais je ne la connais pas.
- friend ostream& operator<<(ostream &,const Bdu &);
- friend istream& operator>>(istream &, Bdu &);
-
- public:
- // constructeur
- Bdu(){};
- Bdu(int bouq,const string room_nb, unsigned add);
-
- // services
- int get_bouquet ();
- unsigned get_addr ();
- string& get_room_nbr ();
- void set_bouquet (int b);
- void set_addr (unsigned a);
- void set_room_nbr (string st);
-
- // Méthode statique
- static int set_fileconf(string ouf);
- static string& get_fileconf();
- static void cree_fromFile(string&); // Rempli le vector avec les Bdu
- // trouvé dans un fichier
- // variable statique
- static vector<Bdu> myVect; // Vector<Bdu> contenant tout les
- private: // Bdu initialisés lors du prog
- string room_nbr;
- int bouquet;
- unsigned addr;
- static string conf_file;
-
- };
- // Les Membres static doivent etre déclaré en dehor de la classe
- // Un peu comme une varible globale ( c'est un peu leur rôle)
- string Bdu::conf_file="TVconfig.txt"; // Nom du fichier de configuraiton en dur.
- vector<Bdu> Bdu::myVect(0);
-
- Bdu::Bdu(int bouq,const string room_nb, unsigned add){
- set_bouquet(bouq);
- set_addr(add);
- set_room_nbr(room_nb);
- myVect.push_back(*this); //"pousse" le nouveau Bdu en fin de vector
- };
-
-
- void Bdu::cree_fromFile(string &temp=Bdu::get_fileconf()){
- // La Méthode ouvre un flux sur un fichier passé en paramètre
- // Si il n'y en a pas on prend celui par défaut
- ifstream myStreamIn( temp.c_str() ); // ouverture du ifstream
- // c_str() car les string en c++ ne se termine pas par '\0'
- if (myStreamIn.fail()){
- cerr <<"Erreur Impossible d'ouvrir le fichier"<<Bdu::get_fileconf()<<endl;
- } else {
- string line;
- while( getline( myStreamIn, line/*,char delimiter='\n' est omis*/ ) ){
- // parcqu'implicite selon MSDN
- if (line[0] == '*' ) continue; // Si la ligne commence par *
- // on passse a la suivante
- Bdu bdu;
- istringstream iss(line);// Création d'un InputStream, d'apres une chaine
-
- iss >> bdu; // Opération possible grace à la surcharge de
- // >>, voir l'implémentation
- if (iss) // <- une idée ?
- myVect.push_back(bdu); //On metle Bdu tout frais dans Le vector<Bdu>
- } // inhérent à la classe
- }
-
- }
-
- // GETTER permet de lire les membres privés
- int Bdu::get_bouquet() { return bouquet; }
- unsigned Bdu::get_addr() { return addr; }
- string& Bdu::get_room_nbr() { return room_nbr;}
- string& Bdu::get_fileconf() { return conf_file;}
-
- // SETTER permet de changer les membres privés
- void Bdu::set_bouquet (int b) { bouquet=b;}
- void Bdu::set_addr (unsigned a){ addr=a; }
- void Bdu::set_room_nbr (string st) { room_nbr = st;}
- int Bdu::set_fileconf (string ouf){ conf_file=ouf; return (1);}
-
-
- // SURCHARGE D'OPERATEUR
- ostream & operator<<(ostream &flux,Bdu &bdu){
- // Une merveille de l'orienté objet :D
- // Cette méthode est appellé à chaque fois qu'une instance de Bdu
- // se trouve à droite de l'opérateur <<, qui pointe vers un flux de sortie
- flux << bdu.get_room_nbr() << "\t\t " << hex << bdu.get_bouquet() \
- << dec << "\t\t " << bdu.get_addr();
- // rajoute la valeur des membres aux flux
-
- return flux; // retourne le flux ainsi modifié pour qu'il poursuive.
- }
-
- istream & operator>>(istream &flux, Bdu &bdu){
- // De meme que pour l'operateur >>
- // Je l'ai déclaré en friend car elle modifie directement les membres
- // Je crois qu'il aurait était difficile de mettre les "setter" à la place
- flux >> bdu.room_nbr >> hex >> bdu.bouquet >> dec >> bdu.addr;
- // Au passage on convertit bouquet(Le deuxieme champ) en héxadécimal
- // sinon il y une erreur à cause du x. Dans ce cas le flux n'est
- // plus valide d'ou le if (istream&) ligne 88 (AMHA)
- return flux;
- }
-
-
-
- int main(){
- string erf = "chambre.txt"; //
- Bdu::cree_fromFile(erf);
- for (int i(0);i<Bdu::myVect.size();i++){ cout << Bdu::myVect[i] << endl; }
- // Bdu::myVect[i] est interpréter comme une référence à un
- // Bdu, cela est due au template de la classe Vector
- // voire ligne 44
- Bdu aCree;
- cin >> aCree; // toujour grace a la méthode ligne 120, cin est un istream
- cout << aCree << endl; // de même on pourrais aisément enregistrer un Bdu
- // dans un fichier
- cout << __FILE__ << endl; // ch'tite macro prédéfinie renvoie le nom
- return (0); // du fichier compile.
- }
/*
//======= SAMPLE DU FICHIER DE CONFIGURATION =============
* bla bla bla
* bla bla
chab01 0x0000 16777000
dball39 0 16776999
hour26 0x0015 16776992
erfe27 0x001a 16777000
//=============== Fin Du sample ============
//=============== debut du code =========== */
/* ***********************************************
class BDU
BDU.Cpp
*************************************************** */
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
class Bdu{
// Ces deux methodes sont déclarées en friend car elle accèdent directement
//,notemment la deuxième, au membre privée de la classe, une autre solution
// est possible mais je ne la connais pas.
friend ostream& operator<<(ostream &,const Bdu &);
friend istream& operator>>(istream &, Bdu &);
public:
// constructeur
Bdu(){};
Bdu(int bouq,const string room_nb, unsigned add);
// services
int get_bouquet ();
unsigned get_addr ();
string& get_room_nbr ();
void set_bouquet (int b);
void set_addr (unsigned a);
void set_room_nbr (string st);
// Méthode statique
static int set_fileconf(string ouf);
static string& get_fileconf();
static void cree_fromFile(string&); // Rempli le vector avec les Bdu
// trouvé dans un fichier
// variable statique
static vector<Bdu> myVect; // Vector<Bdu> contenant tout les
private: // Bdu initialisés lors du prog
string room_nbr;
int bouquet;
unsigned addr;
static string conf_file;
};
// Les Membres static doivent etre déclaré en dehor de la classe
// Un peu comme une varible globale ( c'est un peu leur rôle)
string Bdu::conf_file="TVconfig.txt"; // Nom du fichier de configuraiton en dur.
vector<Bdu> Bdu::myVect(0);
Bdu::Bdu(int bouq,const string room_nb, unsigned add){
set_bouquet(bouq);
set_addr(add);
set_room_nbr(room_nb);
myVect.push_back(*this); //"pousse" le nouveau Bdu en fin de vector
};
void Bdu::cree_fromFile(string &temp=Bdu::get_fileconf()){
// La Méthode ouvre un flux sur un fichier passé en paramètre
// Si il n'y en a pas on prend celui par défaut
ifstream myStreamIn( temp.c_str() ); // ouverture du ifstream
// c_str() car les string en c++ ne se termine pas par '\0'
if (myStreamIn.fail()){
cerr <<"Erreur Impossible d'ouvrir le fichier"<<Bdu::get_fileconf()<<endl;
} else {
string line;
while( getline( myStreamIn, line/*,char delimiter='\n' est omis*/ ) ){
// parcqu'implicite selon MSDN
if (line[0] == '*' ) continue; // Si la ligne commence par *
// on passse a la suivante
Bdu bdu;
istringstream iss(line);// Création d'un InputStream, d'apres une chaine
iss >> bdu; // Opération possible grace à la surcharge de
// >>, voir l'implémentation
if (iss) // <- une idée ?
myVect.push_back(bdu); //On metle Bdu tout frais dans Le vector<Bdu>
} // inhérent à la classe
}
}
// GETTER permet de lire les membres privés
int Bdu::get_bouquet() { return bouquet; }
unsigned Bdu::get_addr() { return addr; }
string& Bdu::get_room_nbr() { return room_nbr;}
string& Bdu::get_fileconf() { return conf_file;}
// SETTER permet de changer les membres privés
void Bdu::set_bouquet (int b) { bouquet=b;}
void Bdu::set_addr (unsigned a){ addr=a; }
void Bdu::set_room_nbr (string st) { room_nbr = st;}
int Bdu::set_fileconf (string ouf){ conf_file=ouf; return (1);}
// SURCHARGE D'OPERATEUR
ostream & operator<<(ostream &flux,Bdu &bdu){
// Une merveille de l'orienté objet :D
// Cette méthode est appellé à chaque fois qu'une instance de Bdu
// se trouve à droite de l'opérateur <<, qui pointe vers un flux de sortie
flux << bdu.get_room_nbr() << "\t\t " << hex << bdu.get_bouquet() \
<< dec << "\t\t " << bdu.get_addr();
// rajoute la valeur des membres aux flux
return flux; // retourne le flux ainsi modifié pour qu'il poursuive.
}
istream & operator>>(istream &flux, Bdu &bdu){
// De meme que pour l'operateur >>
// Je l'ai déclaré en friend car elle modifie directement les membres
// Je crois qu'il aurait était difficile de mettre les "setter" à la place
flux >> bdu.room_nbr >> hex >> bdu.bouquet >> dec >> bdu.addr;
// Au passage on convertit bouquet(Le deuxieme champ) en héxadécimal
// sinon il y une erreur à cause du x. Dans ce cas le flux n'est
// plus valide d'ou le if (istream&) ligne 88 (AMHA)
return flux;
}
int main(){
string erf = "chambre.txt"; //
Bdu::cree_fromFile(erf);
for (int i(0);i<Bdu::myVect.size();i++){ cout << Bdu::myVect[i] << endl; }
// Bdu::myVect[i] est interpréter comme une référence à un
// Bdu, cela est due au template de la classe Vector
// voire ligne 44
Bdu aCree;
cin >> aCree; // toujour grace a la méthode ligne 120, cin est un istream
cout << aCree << endl; // de même on pourrais aisément enregistrer un Bdu
// dans un fichier
cout << __FILE__ << endl; // ch'tite macro prédéfinie renvoie le nom
return (0); // du fichier compile.
}
Conclusion
Alors un grand merci a hylvenir[CPP] sur #programmation qui m'aura bien aidé pour les streams. D'ici pas longtemp, j'espère le prog devrais permettre d'envoyer les membres de la classe au travers du port serie.
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|