C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

peut-on définir une fonction membre statique dans un fichier
Goto page 1, 2, 3, 4, 5, 6  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Aurélien Barbier-Accary
Guest





PostPosted: Fri Oct 14, 2005 11:51 pm    Post subject: peut-on définir une fonction membre statique dans un fichier Reply with quote



Bonjour,

petite question comme ça, tout est dans le titre.
Puisqu'on peut écrire

// dans le .hpp
classe cA
{
public:
static const double val;
static const double fonc(const double& d) { return 2*d; }
//...
};
// dans le .cpp
const double cA::val = 1.0;

Comment écrire ceci :

// dans le .hpp
classe cB
{
public:
static const double val;
static const double fonc(const double& d);
//...
};
// dans le .cpp
const double cB::val = 1.0;
const double cB::fonc(const double& d) { return 2*d; }

Chez moi (gcc), ça m'indique des erreurs dans la fonction qui suit le prototype
de la fonction membre statique.
J'ai essayé de ne pas définir une fonction mais un pointeur de fonction mais
j'ai la même erreur.

Quelqu'un a déjà vu/utilisé ce genre de choses ?

Aurélien.
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Oct 15, 2005 1:03 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote



On Sat, 15 Oct 2005 01:51:32 +0200, Aurélien Barbier-Accary
<nospam_star-shoot_mapson (AT) fr (DOT) st>:

Quote:
// dans le .hpp
classe cB

La faute de frappe ici (le "e" à "class") me fait penser que tu n'as
pas fait un copier-coller direct de ton code, et donc que tu n'as pas
tenté de compiler le code posté.

Quote:
{
public:
static const double val;

Je conseillerais plutôt l'écriture suivante, qui me semble plus claire
(mais qui est parfaitement équivalente) :

static double const val;

Quote:
static const double fonc(const double& d);

Idem ici :

static double const fonc (double const& d);

.... sauf que je ne comprends pas l'utilité du premier "const" ici.
Comeau non plus, d'ailleurs, puisqu'il affiche un warning.

Quote:
//...
};
// dans le .cpp
const double cB::val = 1.0;
const double cB::fonc(const double& d) { return 2*d; }


Le code que tu as posté est accepté par Comeau C++ (avec un warning
disant que le "const" de la valeur de retour ne sert à rien[*]).
Donc, si ce code n'est pas accepté par gcc, il y a un problème quelque
part.
Quelle version de gcc utilises-tu, au fait ?


[*] warning: type qualifier on return type is meaningless


Quote:
Chez moi (gcc), ça m'indique des erreurs dans la fonction qui suit le prototype
de la fonction membre statique.

Ça, ça sent le point-virgule oublié.


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Oct 15, 2005 1:06 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote



On Sat, 15 Oct 2005 01:51:32 +0200, Aurélien Barbier-Accary
<nospam_star-shoot_mapson (AT) fr (DOT) st>:

Quote:
static const double fonc(const double& d);

Au fait, je reviens sur ce "const" en trop... tu n'aurais pas essayé
de déclarer une fonction qui soit à la fois "static" et "const", par
hasard ?
Si c'est ça, c'est effectivement impossible : une fonction "static"
n'est pas liée à un objet (i.e. "this" n'y existe pas) ; dire qu'elle
ne modifie pas l'objet n'a donc aucun sens.
(Pour la même raison, une telle fonction ne peut pas non plus être
virtuelle.)


Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 3:11 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Merci pour ta réponse à cette heure tardive.
Pour la suite, j'ai répondu au coup par coup.

Fabien LE LEZ a écrit :
Quote:
On Sat, 15 Oct 2005 01:51:32 +0200, Aurélien Barbier-Accary

// dans le .hpp
classe cB

La faute de frappe ici (le "e" à "class") me fait penser que tu n'as
pas fait un copier-coller direct de ton code, et donc que tu n'as pas
tenté de compiler le code posté.

Faux... et vrai Smile
Il s'agit de code en partie récupéré dans un fichier volumineux et que j'ai
voulu clarifier. Là où il y a des erreurs, c'est que je l'ai refait "à la main" :-O

Quote:
static double const fonc (double const& d);

... sauf que je ne comprends pas l'utilité du premier "const" ici.
Comeau non plus, d'ailleurs, puisqu'il affiche un warning.

Toujours un problème de simplification: pour un double il n'y a pas d'intérêt
mais si fonc renvoie un objet d'une classe Truc alors const peut avoir un
intérêt si Truc a des fonctions qui nécessitent une instance constante.
J'ai refait un exemple complet, voir en bas de ce message.
Rq: gcc (version 3.2.3) ne donne pas de warning même pour un double.

Quote:
// dans le .cpp
const double cB::val = 1.0;
const double cB::fonc(const double& d) { return 2*d; }


Le code que tu as posté est accepté par Comeau C++ (avec un warning
disant que le "const" de la valeur de retour ne sert à rien[*]).
Donc, si ce code n'est pas accepté par gcc, il y a un problème quelque
part.
Quelle version de gcc utilises-tu, au fait ?


[*] warning: type qualifier on return type is meaningless


j'utilise donc gcc 3.2.3 et pour l'écriture "const double" ou "double const",
question d'habitude :-)

Quote:
Chez moi (gcc), ça m'indique des erreurs dans la fonction qui suit le prototype
de la fonction membre statique.

Ça, ça sent le point-virgule oublié.


Malheureusement non, il y est pourtant bien dans mon exemple :-(

Bon, mon premier message a été fait à la va-vite, donc pour lever toutes les
ambiguités voila un programme complet qui montre les problèmes et les intérêts
des const :

Euh là on est un peu plus tard et l'exemple de programme est fait (ci-dessous)
mais je n'arrive pas à reproduire sur un exemple simple mon problème qui
n'apparait cependant que lorsque je défini dans un .cpp le corps d'une fonction
statique alors que en inline tout compile et fonctionne bien !??
L'exemple ci-dessous à au moins le mérite de montrer que les const imposés pour
les valeurs de retours ne snt pas inutiles ni des erreurs.
Je comprends de moins en moins pourquoi mon vrai code ne compile pas ...
Je vais repartir de lui et le simplifier (pas facile car il y a bcp de
dépendances), on verra bien...


//------------------------------------------------------------------------------
//Truc.hpp

#ifndef __TRUC__
#define __TRUC__

#include <iostream>

class Truc
{
protected:
double x, y;
public:
Truc(const double& a, const double& b) : x(a), y(b) {}
void affiche(void) const { std::cout << x << ", " << y << std::endl; }
Truc& operator+=(const Truc& t) { x+=t.x; y+=t.y; return *this; }
};

class cA1
{
public:
static const Truc val;
static const Truc fonc() { return Truc(-1.0, 0.0); }
// ces valeurs n'ont pas à être modifiées, elles jouent un rôle de constantes
};

class cA2
{
public:
static Truc val;
static Truc fonc() { return Truc(-1.0, 0.0); }
// on autorise la modification -> non sens (cf main.cpp)
};

class cB
{
public:
static const Truc val;
static const Truc fonc(); // corps dans un .cpp (utile si gros)
};

#endif


//------------------------------------------------------------------------------
//Truc.cpp

#include "truc.hpp"

const Truc cA1::val = Truc(1.0, 0.0);

Truc cA2::val = Truc(1.0, 0.0);

const Truc cB::val = Truc(1.0, 0.0);
const Truc cB::fonc(void) { return Truc(-1.0, 0.0); }
// dans mon vrai exemple c'est quand j'utilise cette écriture que ça plante !?!


//------------------------------------------------------------------------------
//main.cpp

#include "truc.hpp"

int main(int argc, char* argv[])
{
(cA2::val += cA2::fonc()).affiche(); // on peut le faire mais ça n'a pas de
sens -> pas cool
// oui c'est moche comme code mais c'est un exemple (abstrait) court

//(cA1::val += cA1::fonc()).affiche();
// erreur de compilation, c'est ce qu'on voulait !!!

Truc mon_cA = cA1::val;
(mon_cA += cA1::fonc()).affiche(); // comme ça c'est logique -> autorisé

cB::fonc().affiche();

return EXIT_SUCCESS;
}


##------------------------------------------------------------------------------
##Makefile

HDRS = truc.hpp
SRCS = main.cpp truc.cpp
OBJS = $(SRCS:.cpp=.o)
EXE = truc.exe
LIBS =
LIBSDIR =

all:
@make -ks $(EXE)

$(EXE): $(OBJS)
g++ $(OBJS) -o $@ $(LIBSDIR) $(LIBS)

clean:
rm -f $(EXE) $(OBJS) *~

%.o: %.cpp $(HDRS)
g++ -c $< -o $@

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 3:11 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Sat, 15 Oct 2005 01:51:32 +0200, Aurélien Barbier-Accary

static const double fonc(const double& d);


Au fait, je reviens sur ce "const" en trop... tu n'aurais pas essayé
de déclarer une fonction qui soit à la fois "static" et "const", par
hasard ?
Si c'est ça, c'est effectivement impossible : une fonction "static"
n'est pas liée à un objet (i.e. "this" n'y existe pas) ; dire qu'elle
ne modifie pas l'objet n'a donc aucun sens.
(Pour la même raison, une telle fonction ne peut pas non plus être
virtuelle.)


comme j'ai essayé de le montrer dans ma réponse à ton premier message, il n'y a
pas de const en trop et il ne s'agit donc pas d'une tentative de déclaration de
fonction statique constante (qui s'écrirait avec un const à la fin).

Aurélien.

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 3:59 am    Post subject: [Boulet] pas un pb de fonction statique mais de function try Reply with quote

oulala, j'aurais mieux fait d'aller me coucher hier soir !
J'explique ce qui se passait: j'utilise une fonction statique dans chacune de
mes classes en mode debug pour effectuer un test de chacune des fonctions
implémentées.
Dans une classe j'utilise notamment 3 fonctions qui déclenchent des exceptions
en cas de problème et je les défini à l'aide de functions-try-block,
c'est-à-dire qu'elles ressemblent à quelque chose de ce type :
/<type retour> ma_fonction(<params>)
try{ /* code try */ }
catch(std::exception& e) { std::cerr << e.what() << std::endl; }/
et que donc les blocs try et catch ne sont pas des sous-parties du corps de la
fonction.

J'avais testé ces fonctions (inline) et elles compilaient et fonctionnaient bien
mais il se trouve que quand elles sont utilisées au sein d'une fonction
statique, à la compilation j'ai des erreurs
/warning: control reaches end of non-void function/

Pour éviter les malentendus, je précise que dans ma fonction statique d'une
classe cA, je défini des objets de type cA sur lesquels j'effectue des
opérations (de cA) suceptibles de déclencher des interruptions.

Finalement, si je n'utilise pas une définition par function-try-block mais une
définition plus classique avec des sous-blocs, ça fonctionne.

Le comportement du compilateur me semble bizarre...
Je vais dormir un peu, j'y verrai sans doute plus clair.
Désolé pour la pollution du forum et merci encore à Fabien.
Et si quelqu'un a une idée du pourquoi de ce comportement de gcc je suis preneur!

Aurélien.

PS: pour ceux qui se demandent pourquoi utiliser des functions-try-block :
http://www.yannis.bres.name/Teaching/UNSA/MInfo/C++/Slides/1-Exceptions/index_v3_document.html
http://www.csci.csusb.edu/dick/c++std/cd2/except.html
google
Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Oct 15, 2005 4:29 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

On Sat, 15 Oct 2005 05:11:41 +0200, Aurélien Barbier-Accary
<nospam_star-shoot_mapson (AT) fr (DOT) st>:

Quote:
static const Truc val;
static const Truc fonc() { return Truc(-1.0, 0.0); }
// ces valeurs n'ont pas à être modifiées, elles jouent un rôle de constantes

Gnii ?..

Le "static const Truc val;" est correct, il n'y a rien à dire.

Le const de "static const Truc fonc()" est au contraire inutile : même
si tu ne spécifies pas "const", l'objet retourné est de toutes façons
est une rvalue :

class C
{
public:
static int fonc() { return 5; }
};

int main()
{
C::fonc()= 3; // Erreur ici car C::fonc() est une rvalue.
}



Quote:
const Truc cB::val = Truc(1.0, 0.0);

Pourquoi une écriture si compliquée ?

const Truc cB::val (1.0, 0.0);

est plus simple, et évite une copie inutile.

Quote:
const Truc cB::fonc(void) { return Truc(-1.0, 0.0); }

C'est vraisemblablement purement cosmétique, mais le "void" est
déconseillé en C++, d'autant que tu ne l'as pas mis dans le prototype
de la fonction.

Quote:
// dans mon vrai exemple c'est quand j'utilise cette écriture que ça plante !?!

Ça plante ou tu as des erreurs de compilation ?

Quelles sont ces erreurs, au fait ?
Sans avoir les messages d'erreurs exacts, il est bien difficile de
faire autre chose que parler dans le vide...


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Oct 15, 2005 4:37 am    Post subject: Re: [Boulet] pas un pb de fonction statique mais de function Reply with quote

On Sat, 15 Oct 2005 05:59:23 +0200, Aurélien Barbier-Accary
<nospam_star-shoot_mapson (AT) fr (DOT) st>:

Quote:
/<type retour> ma_fonction(<params>)
try{ /* code try */ }
catch(std::exception& e) { std::cerr << e.what() << std::endl; }/

Je ne sais pas bien pourquoi cette syntaxe a été introduite, mais il
me semble qu'elle est totalement inutile.
Encore une facétie des auteurs de la norme ?

Back to top
Franck Branjonneau
Guest





PostPosted: Sat Oct 15, 2005 7:18 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Aurélien Barbier-Accary <nospam_star-shoot_mapson (AT) fr (DOT) st> écrivait:

Quote:
class cA1
{
public:
static const Truc val;
static const Truc fonc() { return Truc(-1.0, 0.0); }
// ces valeurs n'ont pas à être modifiées, elles jouent un rôle de
constantes
};

class cA2
{
public:
static Truc val;
static Truc fonc() { return Truc(-1.0, 0.0); }
// on autorise la modification -> non sens (cf main.cpp)
};

struct cA3 {
static Truc const val;
static Truc fonc() { return Truc(-1.0, 0.0); }
};

Quote:
const Truc cB::val = Truc(1.0, 0.0);
const Truc cB::fonc(void) { return Truc(-1.0, 0.0); }
// dans mon vrai exemple c'est quand j'utilise cette écriture que ça
plante !?!

Et si tu nous donnais le message d'erreur ?

Quote:
//(cA1::val += cA1::fonc()).affiche();
// erreur de compilation, c'est ce qu'on voulait !!!

Mais elle n'est pas liée à la constance de la valeur retournée far
cA1::fonc().

cA3::val += cA3::fonc();

donne la même erreur de compilation.

Quote:
##Makefile

Est-ce vraiment utile ?
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
Franck Branjonneau
Guest





PostPosted: Sat Oct 15, 2005 7:25 am    Post subject: Re: [Boulet] pas un pb de fonction statique mais de function Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> écrivait:

Quote:
On Sat, 15 Oct 2005 05:59:23 +0200, Aurélien Barbier-Accary
[email]nospam_star-shoot_mapson (AT) fr (DOT) st[/email]>:

/<type retour> ma_fonction(<params>)
try{ /* code try */ }
catch(std::exception& e) { std::cerr << e.what() << std::endl; }/

Je ne sais pas bien pourquoi cette syntaxe a été introduite, mais il
me semble qu'elle est totalement inutile.

Même dans le cas des constructeurs (dont la liste d'initialisation est
non vide) ?
--
Franck Branjonneau
Back to top
Franck Branjonneau
Guest





PostPosted: Sat Oct 15, 2005 7:32 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Aurélien Barbier-Accary <nospam_star-shoot_mapson (AT) fr (DOT) st> écrivait:

Quote:
Chez moi (gcc), ça m'indique des erreurs dans la fonction qui suit
le prototype de la fonction membre statique.

Ton code me semble correct (modulo s/classe/class/). Puisque l'erreur
apparaît après le prototype et uniquement dans le cpp, je chercherais
si je n'inclus pas dans ce cpp un fichier qui définit une macro fonc.

--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 8:15 am    Post subject: Re: [Boulet] pas un pb de fonction statique mais de function Reply with quote

Franck Branjonneau a écrit :
Quote:
Fabien LE LEZ <gramster (AT) gramster (DOT) com> écrivait:


On Sat, 15 Oct 2005 05:59:23 +0200, Aurélien Barbier-Accary
[email]nospam_star-shoot_mapson (AT) fr (DOT) st[/email]>:


/<type retour> ma_fonction(<params>)
try{ /* code try */ }
catch(std::exception& e) { std::cerr << e.what() << std::endl; }/

Je ne sais pas bien pourquoi cette syntaxe a été introduite, mais il
me semble qu'elle est totalement inutile.


Même dans le cas des constructeurs (dont la liste d'initialisation est
non vide) ?

effectivement cette écriture sert principalement (seulement ?) pour gérer les
exceptions lancées par des données membres dans les constructeurs.
J'ai du faire de l'excès de zèle en voulant l'utiliser pour autre chose que pour
un constructeur.
Il n'en reste pas moins étrange que la compilation dépende de l'utilisation ou
non de ces fonctions dans d'autres fonctions "locales".


Back to top
Fabien LE LEZ
Guest





PostPosted: Sat Oct 15, 2005 8:23 am    Post subject: Re: [Boulet] pas un pb de fonction statique mais de function Reply with quote

On Sat, 15 Oct 2005 09:25:49 +0200, Franck Branjonneau
<fasbjx (AT) free (DOT) fr>:

Quote:
Même dans le cas des constructeurs (dont la liste d'initialisation est
non vide) ?

C'est effectivement le seul cas où ça pourrait être utile.

Note toutefois que si le constructeur d'un membre (ou d'une classe de
base) renvoie une exception, l'objet ne peut pas être créé, donc doit
lui-même renvoyer une exception. Les possibilités pour le "catch"
seront alors assez limitées : enregistrement éventuel de l'erreur dans
un fichier log, puis renvoi de l'exception (ou d'une autre exception).


Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 8:35 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Sat, 15 Oct 2005 05:11:41 +0200, Aurélien Barbier-Accary
[email]nospam_star-shoot_mapson (AT) fr (DOT) st[/email]>:


static const Truc val;
static const Truc fonc() { return Truc(-1.0, 0.0); }
// ces valeurs n'ont pas à être modifiées, elles jouent un rôle de constantes


Gnii ?..

Le "static const Truc val;" est correct, il n'y a rien à dire.

Le const de "static const Truc fonc()" est au contraire inutile : même
si tu ne spécifies pas "const", l'objet retourné est de toutes façons
est une rvalue :

class C
{
public:
static int fonc() { return 5; }
};

int main()
{
C::fonc()= 3; // Erreur ici car C::fonc() est une rvalue.
}


Non, ce n'est pas inutile, la preuve est donnée par l'exemple suivant qui est
possible à tort si on ne met pas le const qui fait débat :

class Truc
{
protected:
double d1, d2;
public:
Truc(const double& a=0, const double& b=0) { d1=a; d2=b; }
Truc& operator=(const Truc& t)
{ d1 = t.d1; d2 = t.d2; }
friend ostream& operator<<(ostream& os, const Truc& t)
{ os << t.d1 << ", " << t.d2 << endl; return os; }
};

class C
{
public:
static const Truc fonc() { return Truc(2,3); }
};

int main(int argc, char* argv[])
{
cout << (C::fonc()= Truc(1,0));
return 0;
}

Quote:
const Truc cB::val = Truc(1.0, 0.0);
Pourquoi une écriture si compliquée ?
const Truc cB::val (1.0, 0.0);
est plus simple, et évite une copie inutile.


alors là c'est une habitude de travail prise à force d'insistance d'un de mes
chefs, mais apparemment à la contruction les deux instructions seraient
équivalentes car détectées par le compilateur !?
Mais tu as raison, il faudrait que je reprenne de bonnes habitudes.

Pour le reste nous y avons tout deux déjà répondu dans un autre fil.

Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Sat Oct 15, 2005 8:38 am    Post subject: Re: peut-on définir une fonction membre statique dans un fic Reply with quote

Franck Branjonneau a écrit :
Quote:
Aurélien Barbier-Accary <nospam_star-shoot_mapson (AT) fr (DOT) st> écrivait:


Chez moi (gcc), ça m'indique des erreurs dans la fonction qui suit
le prototype de la fonction membre statique.


Ton code me semble correct (modulo s/classe/class/). Puisque l'erreur
apparaît après le prototype et uniquement dans le cpp, je chercherais
si je n'inclus pas dans ce cpp un fichier qui définit une macro fonc.


Bien vu mais en fait c'était encore plus bête (étrange) que ça.
cf le fil intitulé:
[Boulet] pas un pb de fonction statique mais de function try block Sad
Désolé mais je ne sais pas faire de lien vers des messages de news.

Merci pour ta réponse !!

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3, 4, 5, 6  Next
Page 1 of 6

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.