Variable globale en C++

Résolu
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 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

francis
 
Salut,
A mon avis tu ferai bien de mettre tes attributs en private, et de faire des accesseurs... le tout en "static".
0
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
Oui j'avais pensé aux accesseurs mais dans mon cas, ils ne peuvent pas marcher.
0
francis
 
pourquoi donc ?
0
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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
francis
 
Pourquoi ne pas instancier DataFile ?!?

A mon avis y a une bonne incohérence de conception là...
0
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
bien sur, elle n'est pas "const".
0
electrikBoy Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
Merci à tous les deux ça faisait facile une semaine que je galérais là dessus et maintenant ça marche.
Merci beaucoup!!!!
0