Variable globale en C++

Résolu
electrikBoy Messages postés 28 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
C'est encore moi, même si je sais que ce n'est pas du tout conseillé j'aimerais savoir comment déclarer une classe globale qui puisse se lire dans tout le code.
Actuellement j'ai réalisé ceci :
Dans le fichier.h :
using namespace std;

class DataFile
{
protected :
FILE *fp;

public :

static int NumberElectrode;
static int NumberSample;
static float MaxActivity;
static float MinActivity;
static float XStep;
static float YStep;
static float ZStep;
static float **Coord;
static char **ElecID;
static float **mat;
DataFile(QString);
/*...*/


Ensuite j'appelle dans le constructeur de cette manière :
DataFile::NumberElectrode=NumberOfElectrode(fp); //NumberOfElectrode(fp) est une fonction qui compte le nombre d'électrode.

Et il m'affiche le message d'erruer suivant :
undefined reference to DataFile ::NumberElectrode

Pouvez vous m'aider?

3 réponses

  1. francis
     
    Salut,
    A mon avis tu ferai bien de mettre tes attributs en private, et de faire des accesseurs... le tout en "static".
    0
    1. electrikBoy Messages postés 28 Statut Membre
       
      Oui j'avais pensé aux accesseurs mais dans mon cas, ils ne peuvent pas marcher.
      0
    2. francis
       
      pourquoi donc ?
      0
    3. electrikBoy Messages postés 28 Statut Membre
       
      Excuse moi j'avais pas pensé à expliquer : à cause de mon constructeur qui prend en paramètre un QString, pour utiliser les accesseurs j'appelle d'abord mon constructeur. Quand j'appelle le constructeur (DataFile (QString)) dans une autre classe le QString est "NULL" alors que dans le DataFile, il a une valeur bien précise.
      Je ne sais pas trop si c'est clair... Je met un peu de code :

      Fichier test.cpp :
      void MyWindow :: message()
      {
      QString File = QFileDialog :: getOpenFileName(0, tr(" Select bin file"), "", tr("*.bin")); //You can select a *bin file
      if (!(File.isNull())) //If the file exists
      {
      int answer = QMessageBox::question(this, "File", "Do you wish to select : \n" + File, QMessageBox::Yes|QMessageBox::No); //Ask confirmation
      if ((answer==QMessageBox::Yes)) //If it's confirmed
      {
      DataFile DF(File);
      }


      Fichier DataFile.cpp:
      DataFile :: DataFile (QString file)
      {

      const char *c=file.toStdString().c_str(); //Convert QString to char
      fp=NULL; //Initialisation
      fp=fopen(c, "rb"); //Opening in binary form
      if (fp!=NULL)
      {
      char *lire=new char[26]; //Create a character
      fgets (lire,26,fp); //Read the title

      DataFile::NumberElectrode=NumberOfElectrode(fp); //Count electrode


      Ensuite dans un autre fichier si je fais le constructeur de DataFile le QString en paramètre sera nul.
      0
    4. francis
       
      Pourquoi ne pas instancier DataFile ?!?

      A mon avis y a une bonne incohérence de conception là...
      0
    5. electrikBoy Messages postés 28 Statut Membre
       
      Si j'arrive à rendre les données de DataFile accessible partout dans le code je n'ai plus de problème. On attend de moi que je réalise une classe propre aux données d'un fichier sélectionné, je ne peux donc pas instancier DataFile.
      0
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Salut.
    Les membres statiques sont similaires aux variables globales. As tu déclarer ta variable quelque part ?
    exemple simplissime :
    ex.h :
    class Ex
    {
       static int ex_var;
    }

    et ex.cpp :
    int Ex::ex_var=0;

    "undefined reference" doit être renvoyé par l'éditeur des liens (important de savoir qui renvoi l'erreur, ça aide à la résoudre) et veux dire que la variable n'est pas présente dans les fichiers objets disponibles.
    0
    1. electrikBoy Messages postés 28 Statut Membre
       
      Euh non je ne l'ai pas fait, merci.
      Est ce que ma variable peut être modifiée dans mon code par la suite?
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      bien sur, elle n'est pas "const".
      0
  3. electrikBoy Messages postés 28 Statut Membre
     
    Merci à tous les deux ça faisait facile une semaine que je galérais là dessus et maintenant ça marche.
    Merci beaucoup!!!!
    0