 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Cyril Gruau Guest
|
Posted: Fri Aug 22, 2003 12:57 pm Post subject: static, cout et portabilite |
|
|
Puisque certains compilateurs ne construisent pas std::cout
avant mes objets static (pgcc 3.2 par exemple),
comment je fais pour afficher quelque chose a la construction
de mes objets static ?
Je suis oblige d'utiliser printf pour assurer la portabilite ?
Cyril
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
|
| Back to top |
|
 |
Cyril Gruau Guest
|
Posted: Fri Aug 22, 2003 3:32 pm Post subject: Re: static, cout et portabilite |
|
|
| Quote: | Il faut construire une variable statique de type std::ios_base::Init
avant tes variables.
|
D'accord mais ou ?
J'ai ajoute
static std::ios_base::Init x;
dans le namespace global
ou dans la declaration de ma classe, sans succes.
Cyril
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Mon Aug 25, 2003 1:56 pm Post subject: Re: static, cout et portabilite |
|
|
le Vendredi 22 Août 2003 17:32, [email]Cyril.Gruau (AT) cemef (DOT) cma.fr[/email] écrivit :
| Quote: | Il faut construire une variable statique de type std::ios_base::Init
avant tes variables.
D'accord mais ou ?
J'ai ajoute
static std::ios_base::Init x;
dans le namespace global
ou dans la declaration de ma classe, sans succes.
|
Mettre les var statiques dans des fonctions pour s'assurer de l'ordre
d'instanciation est une technique expliquée dans le 'Effective C++'.
Dans ton cas, il suffirait d'agir dans le corps des constructeurs de tes
variables statiques qui veulent afficher.
si j'ai bien compris ce que tu veux, tu peux faire comme :
void avant_d_afficher() {
static std::ios_base::Init x;
}
class Toto {
public :
Toto() {
avant_d_afficher();
std::cout << " on intialise un Toto n";
}
};
static Toto toto;
--
Sam
Enlever les mots en trop dans mon e-mail pour répondre
|
|
| Back to top |
|
 |
Cyril Gruau Guest
|
Posted: Mon Aug 25, 2003 4:27 pm Post subject: Re: static, cout et portabilite |
|
|
| Quote: | Mettre les var statiques dans des fonctions pour s'assurer de l'ordre
d'instanciation est une technique expliquée dans le 'Effective C++'.
Dans ton cas, il suffirait d'agir dans le corps des constructeurs de tes
variables statiques qui veulent afficher.
si j'ai bien compris ce que tu veux, tu peux faire comme :
void avant_d_afficher() {
static std::ios_base::Init x;
}
class Toto {
public :
Toto() {
avant_d_afficher();
std::cout << " on intialise un Toto n";
}
};
static Toto toto;
|
Ca continue de ne pas marche avec pgCC
(cela fonctionne pourtant avec g++ et cl.exe).
Voici mon code reduit a sa plus simple expression :
**********
dans .h :
**********
class MaClasse
{
public:
MaClasse();
private:
// je suis contraint d'utiliser un char * par ma hierarchie
static char * chaine;
static MaClasse exemplaire;
};
*************
dans .cpp :
*************
#include
#include "MaClasse.h"
using namespace std;
char * MaClasse::chaine = "blabla";
MaClasse MaClasse::exemplaire = MaClasse() ;
void avant_d_afficher() {
static std::ios_base::Init x;
}
MaClasse::MaClasse()
{
avant_d_afficher();
cout << chaine << endl;
}
**********
resultat :
**********
Memory fault(coredump)
Tandis qu'avec un printf, ca fonctionne
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Mon Aug 25, 2003 8:21 pm Post subject: Re: static, cout et portabilite |
|
|
le Lundi 25 Août 2003 18:27, [email]Cyril.Gruau (AT) cemef (DOT) cma.fr[/email] écrivit :
| Quote: | Ca continue de ne pas marche avec pgCC
(cela fonctionne pourtant avec g++ et cl.exe).
|
au fait, c'est quoi pgCC ? si il s'obstine à faire planter ton exe, tu peux
essayer diverses choses en esperant eviter le bug.
par exple, au lieu d'avoir
class MaClasse {
[..]
static MaClasse exemplaire;
[..]
}
tu pourrais faire une fction membre statique
static MaClasse& MaClasse::UnExemplaire() {
static MaClasse exemplaire=MaClasse();
return exemplaire;
}
et appeler MaClasse::UnExemplaire() qd tu veux acceder à cette instance
statique.
Je crois me rappeler que la construction de la variable se fera au moment du
premier appel de la fonction UnExemplaire(), donc plus tard qu'avec ta
construction actuelle, et avec un peu de chance à ce moment std::cout sera
déja prêt à fonctionner.
--
Sam
Enlever les mots en trop dans mon e-mail pour répondre
|
|
| Back to top |
|
 |
Cyril Gruau Guest
|
Posted: Tue Aug 26, 2003 6:33 am Post subject: Re: static, cout et portabilite |
|
|
| Quote: | au fait, c'est quoi pgCC ?
|
Il s'agit du compilateur C++ de Portland Group
(mon code doit malheureusement etre portable sur ce compilateur).
| Quote: | si il s'obstine à faire planter ton exe, tu peux
essayer diverses choses en esperant eviter le bug.
par exple, au lieu d'avoir
class MaClasse {
[..]
static MaClasse exemplaire;
[..]
}
tu pourrais faire une fction membre statique
static MaClasse& MaClasse::UnExemplaire() {
static MaClasse exemplaire=MaClasse();
return exemplaire;
}
|
Effectivement on peut eviter le probleme ainsi.
Mais il n'en reste pas moins que cout est inutilisable
pendant l'instanciation des membres static.
Cyril
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|