c++ : "illegal pure syntax, must be '= 0'"

c++ : "illegal pure syntax, must be '= 0'" - Programmation

Marsh Posté le 27-05-2001 à 16:43:52    

erreur de compilation :
illegal pure syntax, must be '= 0'
alors que je declare une constante toute conne dans une classe (en private).
 
comment se fait il ?

Reply

Marsh Posté le 27-05-2001 à 16:43:52   

Reply

Marsh Posté le 27-05-2001 à 16:57:18    

Montre ton code.

Reply

Marsh Posté le 27-05-2001 à 17:02:03    

Je met que le .h
 
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
 
// definition des types nécessaires
 
struct SI_Enreg  
{        // description d'un enregistrement du fichier
 string index;    // la clé
 //. . . . .     // le reste de l'enregistrement
 
};
 
enum SI_STATUS {SI_NOK,SI_OK}; // Statut des opérations
 
struct SI_Index  
{        // description d'un poste du tableau des index
 string index;    // la clé
 long numero;    // le numero d'enregistrement correspondant
};
 
 
 
 
// classe FicSI
 
class FicSI  
{
 
private:
        /*c'est là que ca foire !!*/
        const int NB_ENREG = 100;  // nombre maxi d'enregistrements du fichier (on a choisi 100)
 
 fstream fp;      // File pointeur du fichier des données
 string nom_fic;     // pour mémoriser le nom du fichier logique
 bool ouvert;     // pour connaître l'état du fichier logique
 SI_Index tab_idx [NB_ENREG]; // tableau des index
 bool tab_map [NB_ENREG];  // mapping des emplacements libres ou occupés
 
public:
 FicSI(const char * fichier);
 ~FicSI();
 void fermer();
 SI_STATUS ajout(SI_Enreg elem);
 SI_STATUS lire(SI_Enreg & elem, string cle);
 SI_STATUS supprimer(string cle);
 SI_STATUS reecrire(SI_Enreg elem);
 
private:
 bool chercher(string cle, int & rang);
 bool positionner(long numero);
};
 
 
si ca peut vous aider, je suis sous visual 6.

Reply

Marsh Posté le 27-05-2001 à 17:08:50    

Si le membre n'est pas statique on ne peut pas l'initialiser comme ça.
Déclare le statique.
 
Ou alors initialise le avec le constructeur:
FicSI(const char * fichier): NB_ENREG(100) { blabla ....

Reply

Marsh Posté le 27-05-2001 à 17:11:58    

okay !
pour l'anecdote, le .h a été écrit par mon prof de c++

Reply

Marsh Posté le 27-05-2001 à 17:12:53    

C'est simple, tu ne peux pas déclarer une variable dans une classe en lui attribuant directement une valeur. Il faut le mettre dans le constructeur.
D'un cote, c'est vrai que c'est chiant, mais au moins les initialisations sont toutes au même endroit.

Reply

Marsh Posté le 27-05-2001 à 17:15:07    

je pense que je vais declarer la constante en global

Reply

Marsh Posté le 27-05-2001 à 17:21:01    

mr_mat a écrit a écrit :

je pense que je vais declarer la constante en global




Ton prof risque de pas aimer.

Reply

Marsh Posté le 27-05-2001 à 17:22:50    

pourquoi ? c'est deconseillé ??

Reply

Marsh Posté le 27-05-2001 à 17:34:41    

Il a raison les globales c plus de la methodologi C que C++
 

mr_mat a écrit a écrit :

pourquoi ? c'est deconseillé ??



Reply

Marsh Posté le 27-05-2001 à 17:34:41   

Reply

Marsh Posté le 27-05-2001 à 20:22:48    

Verdoux a écrit a écrit :

Si le membre n'est pas statique on ne peut pas l'initialiser comme ça.
Déclare le statique.
 
Ou alors initialise le avec le constructeur:
FicSI(const char * fichier): NB_ENREG(100) { blabla ....




 
Surtout que comme c'est une constante, elle est logiquement globale a toute les instances de la classe.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-05-2001 à 20:37:15    

En plus il se sert de NB_ENREG pour des tableaux membres.
Donc là il faudrait plutôt un:
enum {NB_ENREG = 100};

Reply

Marsh Posté le 27-05-2001 à 22:40:30    

le mieux c'est la variale static commune a toute ta classe. c'est plus propre.

Reply

Marsh Posté le 28-05-2001 à 08:32:14    

Initialise ton memebre dans le constructeur de la classe au lieu de le faire a la barbare avec sa declaration , ca fait plus propre ! et ca marche !

Reply

Marsh Posté le 28-05-2001 à 09:39:06    

Je voudrais poser une question qui n'a pas de rapport avec le sujet mais je vois que tu utilises fstream.
J'arrive pas a bien l'utiliser, j'explique :
 
mon fichier généré par Matlab :
    3.00000
    1.00000
    3.80000
    0.00290
    0.00500 ...
 
le code C++ pour le lire :
int nb;
double lg;
fstream * fichier;
fstream = new fstream("donnees",ios::in);
fichier->getline(reinterpret_cast(&nb), sizeof(nb));
fichier->getline(reinterpret_cast(&lg), sizeof(lg));
fichier->close();
 
Je veux en fait récupérer les valeurs de mon fichier et les convertir dans un type donnée. Mais quand je regarde les valeurs récupérées, c'est du style 256789630.  :ouch:  
What is the problem ?  :sweat:  
 
PS : A quoi sert using namespace std ?
      A la compile, il ne trouve pas les fichiers en-tête iostream et fstream. Je suis obligé de lui spécifié le chemin .../g++-3 ?  :gun:

 

[edit]--Message édité par DuffBeer--[/edit]

Reply

Marsh Posté le 28-05-2001 à 09:48:34    

Je vais créer un nouveau topic, ça sera plus clair (et j'aurais peut-être plus de réponses).

Reply

Marsh Posté le 28-05-2001 à 09:50:16    

1) si tu fais ddu C++ autant utiliser les opérateurs appropriés : fichier >> nb;
 
2) si il y a marqué 3.0000 dans ton fichier, il faut que tu lises un float et que tu le 'cast' en int .
 
3) using namespace std : ça dépende de ton compilo je crois mais gcc s'en passe. ça sert à rentrer dans l'espace de  nommage de la bibliothèque standard.
 
4) appelle bien g++ et pas gcc et met les bonnes extensions à tes fichiers (.cc ou .C ou .cpp ou voir man g++)

Reply

Marsh Posté le 28-05-2001 à 09:52:41    

mr_mat > c'est quoi comme compilateur qui te met cette erreur ? passke "illegal pure syntax, must be '= 0'" c'est hyper bizarre...

Reply

Marsh Posté le 28-05-2001 à 09:52:44    

mr_mat > c'est quoi comme compilateur qui te met cette erreur ? passke "illegal pure syntax, must be '= 0'" c'est hyper bizarre...

Reply

Marsh Posté le 28-05-2001 à 18:35:45    

c'est visual 6 de chez gro$oft !
c clair moi aussi j'ai triuvé ca bizarre ! d'où ce post (vive les messages d'erreur très explicites ...)

Reply

Marsh Posté le 29-05-2001 à 01:09:14    

Ce message d'erreur vient du fait que quand tu declare une classe abstraite. c'est bizarre, mais si tu veux faire une classe abstraite, tu dois ecrire :
class X
{
   type methode X(...) = 0;
}
 
Dans la doc MSDN, c'est ce qu'il appellent des classes "pure virtual". Il suffit d'écrire "=0" apres une methode pour que la classe soit abstraite. c'est bizarre, mais ca marche vraiment.
 
 
Tenez, voila un extrait de cette doc :
 
"In the following program, draw() is a pure virtual function defined in the abstract class Shape. You cannot declare Shape objects. Shape acts as a base class for Rectangle and Circle. Rectangle and Circle provide definitions for draw(), so you can declare instances of those classes and call draw() for them.
 
// Example of a virtual function and abstract classes
#include <iostream.h>
 
class Shape
{
public:
   virtual void draw() = 0;
};
 
class Rectangle: public Shape
{
public:
   void draw();
};
 
class Circle : public Shape
{
public:
   void draw();
};
"

Reply

Marsh Posté le 29-05-2001 à 01:24:00    

Oui, mais sa classe class FicSI  est pas pure virtual, ou alors le code poste est pas celui utilise.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-05-2001 à 01:32:13    

Bah, t'as pas suivi : ce que je te dis c'est que le problème vient de la. VC++ attend qu'il tape methodeX()=0 car c'est la seule chose qu'il peut "initialiser" directement. Il ne peut pas ecrire  
class X
{
     public :
        int y = 2;   //bam, erreur de compilation.  
                     //il attendait un nom de methode
}
 
c'est-y pas clair ?

Reply

Marsh Posté le 29-05-2001 à 01:56:56    

OK c'est clair.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed