| |||||
| Dernière réponse | |
|---|---|
| Sujet : c++ : "illegal pure syntax, must be '= 0'" | |
| gilou | OK c'est clair.
A+, |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| gilou | OK c'est clair.
A+, |
| oliv5 | 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 ? |
| gilou | Oui, mais sa classe class FicSI est pas pure virtual, ou alors le code poste est pas celui utilise.
A+, |
| oliv5 | 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(); }; " |
| 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 ...) |
| minusplus | mr_mat > c'est quoi comme compilateur qui te met cette erreur ? passke "illegal pure syntax, must be '= 0'" c'est hyper bizarre... |
| minusplus | mr_mat > c'est quoi comme compilateur qui te met cette erreur ? passke "illegal pure syntax, must be '= 0'" c'est hyper bizarre... |
| minusplus | 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++) |
| DuffBeer | Je vais créer un nouveau topic, ça sera plus clair (et j'aurais peut-être plus de réponses). |
| DuffBeer | 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] |
| ragefan | 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 ! |
| oliv5 | le mieux c'est la variale static commune a toute ta classe. c'est plus propre. |
| verdoux | En plus il se sert de NB_ENREG pour des tableaux membres.
Donc là il faudrait plutôt un: enum {NB_ENREG = 100}; |
| gilou |
|
| Amadeus | Il a raison les globales c plus de la methodologi C que C++
|
| pourquoi ? c'est deconseillé ?? |
| verdoux |
|
| je pense que je vais declarer la constante en global |
| oliv5 | 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. |
| okay !
pour l'anecdote, le .h a été écrit par mon prof de c++ |
| verdoux | 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 .... |
| 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. |
| verdoux | Montre ton code. |
| 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 ? |




