Rechercher : dans
Par :

[C++] membre static, pb de compilation

Dernière réponse le 30 jui 2007 à 15:25:44 Char Snipeur, le 29 nov 2006 à 13:03:42 
 Signaler ce message aux modérateurs

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 :
l.13 : undefined reference to `eau::b'
Donc si quelqu'un pouvai me dire ce qui se passe...
Si ça se passe chez lui aussi. Salutation !
Char Snipeur

Meilleures réponses pour « [C++] membre static, pb de compilation » dans :
La compilation et les modules en C et en C++ Voir Cet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Les inlines en C++ VoirSignification Exemple 1 Inline et headers Exemple 2 Signification Le mot-clé inline est utilisé en C++ et s'applique à une fonction. Il indique au compilateur que chaque appel à la fonction inline devra être remplacé par le corps de cette...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Le mot-clé static ou les attributs et méthodes de classe en POO Voir(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore,...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...

1

mamiemando, le 29 nov 2006 à 16:49:38
  • +1

  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

Répondre à mamiemando

2

Char Snipeur, le 29 nov 2006 à 21:40:19

Salut.
Merci pour ta réponse.
Par contre, ton compilateur te renvoie des messages un peu plus cohérent.
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. Bref, j'ai essayer, j'ai planter et je me suis démerder.
Et maintenant, je me disait que mon problème aurai pu être résolue grace à "static"... Donc, mon but est de regarder comment utilisé ce mot clé, et notament de faire un tableau de double en static.
Ce qui ne semble pas fonctionner.
Les instructions :
(a*eau::b[0]);
et
eau::b[0];
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. Salutation !
Char Snipeur

Répondre à Char Snipeur

3

mamiemando, le 30 nov 2006 à 08:52:39

Bon je pense que tu n'as pas bien compris à quoi servait le mot clé static. Alors pour static il y a deux utilisations :
1) pour des membres de classes (variables)
2) pour des méthodes

1) Pour les membres de classe :

Il s'agit d'un membre partagé en commun par toutes les instances de cette classe. C'est à dire que si tu la modifies dans un objet de cette classe ça va la corriger dans tous les autres objets de ce type. C'est une sorte de variable globale dont la portée est limitée à la classe.

Exemple d'utilisation : compter le nombre d'instance de classe :

#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)

Répondre à mamiemando

4

Char Snipeur, le 30 nov 2006 à 13:10:52

Salut.
Merci pour ta réponse, j'avai bien compris l'utilisation de static. Le seul problème c'est que je me heurte à des problèmes pratique de compilation.
Mais après divers tests, j'ai trouvé la règle:
Il est possible d'inialisé une variable static dans la class SI elle est const.
Si elle n'est pas const ou que c'est un tableau, alors il faut le faire en dehors de la class.

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

Répondre à Char Snipeur

5

mamiemando, le 30 nov 2006 à 14:54:31

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

Répondre à mamiemando

6

 10di&, le 30 jui 2007 à 15:25:44

Il est possible d'initialiser un membre const static SI il est de type int !

static const int i = 0; //Fonctionne
static const double d = 0.0;//Fonctionne pas

http://c.developpez.com/faq/cpp/?page=static#CLASS_static_co­nst

Répondre à 10di&