|
|
|
|
Bonjour,
J'ai DevCpp 4.9.8, et je rencontre le problème suivant :
Le code qui suis compile et s'execute parfaitement:
struct eau
{
static const double a=12;
static const double b[3]={0,1,2};
static double P2TD(double T,double D)
{double c;
b[0];
(a*eau::b[0]);
return c;}
};
int main()
{
double P=eau::P2TD(325,456);
eau::b[0];
return 0;
} En revanche, si je modifie légèrement celui ci de la façon suivante :
struct eau
{
static const double a=12;
static const double b[3]={0,1,2};
static double P2TD(double T,double D)
{double c;
c=b[0];
(a*eau::b[0]);
return c;}
};
int main()
{
double P=eau::P2TD(325,456);
eau::b[0];
return 0;
} le compilateur me renvoi l'erreur :
1 struct eau
2 {
3 static const double a=12;
4 static const double b[3]={0,1,2};
5 static double P2TD(double T,double D){
6 double c;
7 c=eau::b[0];
8 (a*eau::b[0]); // inutile ?
9 return c;
10 }
11 };
12
13 int main()
14 {
15 double P=eau::P2TD(325,456);
16 eau::b[0]; // inutile ?
17 return 0;
18 }
Chez moi ca ne compile pas et pour moi ton code ne veut pas dire grand chose : (mando@silk) (~) $ g++ plop.cpp
plop.cpp:4: error: a brace-enclosed initializer is not allowed here before '{' token
plop.cpp:4: error: invalid in-class initialization of static data member of non-integral type 'const double [3]'
plop.cpp: In static member function 'static double eau::P2TD(double, double)':
plop.cpp:7: error: 'b' is not a member of 'eau'
plop.cpp:8: error: 'b' is not a member of 'eau'
plop.cpp: In function 'int main()':
plop.cpp:16: error: 'b' is not a member of 'eau'
Je n'ai pas compris ce que tu veux faire, en particulier, aux lignes : (a*eau::b[0]); ... eau::b[0]; Ces deux instructions ne font a priori... rien :) Enfin je n'ai pas compris l'intérêt du struct eau... Ce n'est pas plutôt un namespace que tu veux créer ? Bonne chance |
Salut.
|
Bon je pense que tu n'as pas bien compris à quoi servait le mot clé static. Alors pour static il y a deux utilisations :
#include <iostream>
class plop{
protected:
static unsigned int nb_instance_plop=0;
int x;
public;
plop(int x0):x(x0){
++nb_instance_plop;
std::cout << nb_instance_plop << "eme instance 'plop'" << std::endl
}
};
int main(){
plop p1(10);
plop p2(6);
plop p3(9);
return 0;
}
2) Méthodes static Tu peux avoir envie de rattacher une fonction à une structure sans que pour autant celle-ci se raccroche à une instance de la classe (this->) car cette méthode n'utilise aucun attribut de l'instance. Exemple. #include <iostream>
class plop(){
protected:
unsigned int x;
public:
plop(unsigned int x0):x(x0){}
static inline void nom_classe(){
std::cout << "plop" << std::endl;
}
};
int main(){
plop p1(69);
plop::nom_classe();
return 0;
}
Ce que je voulais faire est historique. Je voulais créer une classe eau, qui permet de calculer les propriétes physique de l'eau. Le calcul ce fait sur plusieurs fonctions différentes, et avec des variables qui passent de l'une à l'autre. J'ai rien compris ! Donne moi un exemple. Sont là pour réaliser un appel à eau::b[0], pour voir si ça fonctionne : si j'ai bien compris le livre, lorsque tu tape "1+3+8*9+6;" le calcul est bien effectué, mais comme il n'est pas assigné à une variable ou afficher, c'est COMME SI tu ne fesait rien. Effectivement le calcul est fait mais le résultat n'est stocké ni utilisé nul part donc l'instruction ne sert à rien (à part ralentir le programme :p) |
Salut.
struct eau
{
static const double a=12;
static double e;
static const double b[3];//={0,1,2};
static double P2TD(double T,double D)
{double c;
c=b[0];
c=(a*eau::b[0]);
return c;}
};
static double abc=125;
int main()
{
double a=eau::e;
double P=eau::P2TD(325,456);
double tab[3]={0,1,2};
tab[0]=eau::b[0];
return 0;
}
double eau::e=3;
const double eau::b[3]={0,1,2};
ce code compilera sans pb.
En revanche, struct eau
{
static double a=0;
}
ne compile pas, le compilateur me renvoie l'erreur qu'en iso C++ il est interdit d'initialisé un membre static . chez moir ton "static unsigned int nb_instance_plop=0;" ne compil pas et me renvoie l'erreur : ISO C++ forbids in-class initialization of non-const static member `nb_instance_plop' La seul chose que je n'ai pas compris, c'est le pourquoi de la règle que j'ai énoncé... Sinon, je pensai qu'il est possible d'utiliser un namespace comme une classe purement static ? (en quelque sorte.) Par exemple, dans mon cas de calculer les proprietes de l'eau, avoir un class eau est ridicule, car un seul objet est suffisant, donc remplacer struct par namespace est plus aproprié. Salutation ! Char Snipeur |
Tu as raison je me suis trompée, dans ce cas précis la variable static est en fait interne à la fonction (ou doit rester const) :
#include <iostream>
class plop{
protected:
unsigned int x;
public:
plop(unsigned int x0):x(x0){
static unsigned int nb_instance_plop = 0;
++nb_instance_plop;
std::cout << nb_instance_plop << "eme instance 'plop'" << std::endl;
}
static inline void nom_classe(){
std::cout << "plop" << std::endl;
}
};
int main(){
plop p1(69);
plop p2(28);
plop p3(47);
plop::nom_classe();
return 0;
}
Dans ton cas il suffit de faire : #include <iostream>
namespace eau{
unsigned int a = 56;
}
int main(){
std::cout << a::eau << std::endl;
return 0;
}
Bonne chance |
Il est possible d'initialiser un membre const static SI il est de type int !
|