bonjour ,
G un projet avec 2 cpp et 2 .h .
Je souhaiterai déclarer et initialiser 1 variable string gloable (les 2 cpp ).
G essayé plusieurs truc mais bof....
si je déclare string str ; erreur dans la déclaration
merci beaucoup par avance
bonjour ,
G un projet avec 2 cpp et 2 .h .
Je souhaiterai déclarer et initialiser 1 variable string gloable (les 2 cpp ).
G essayé plusieurs truc mais bof....
si je déclare string str ; erreur dans la déclaration
merci beaucoup par avance
Bonjour,
As-tu déclaré l'utilisation du namespace standard avant?
Afin d'éviter les variables globales de ce type ( pas bien! ).using namespace std;
// ou
using std::string;
Tu à plusieurs autres approches plus propres et respectant la philosophie OO.
1- Déclarer la string avant de passer la référence au constructeur des deux classes. Attention à la durée de vie de la string
2- Encapsuler la string dans une classe, prévoir les services offert par ta classe et les implémenter. Instancier la classe 1 fois et passer la référence sur au constructeur des deux classes. Attention à la durée de vie de la classe
La deuxième solution est de loin préférable si tu travail en multithread, tu pourras ainsi pouvoir mettre en œuvre des mécanismes de synchronisation correctement dans les services donnés.
Homer J. Simpson
G bien
using namespace std;
// ou
using std::string;
dans les 2 Cpp .
Pourquoi le type string pose un tel problème ?
si je veux découper un projet en plusieurs cpp pour une meilleure clarté sans faire de nouvelle classe , je le déclare comment ?
En C# on met partial class
merci beaucoup
As tu #include <string>
Quel est le message d'erreur?
N'as tu pas une autre variable global nommé str?
Homer J. Simpson
g cet include sur les 2 cpp .
Si je déclare string str -> erreur dans la déclaration
Si je déclare String str -> OK
Sauf que les membres entre string et String ne sont tout à fait les même ..
si je veux découper un projet en plusieurs cpp pour une meilleure clarté sans faire de nouvelle classe , je le déclare comment ?
En C# on met partial class
merci
Pour utiliser une variable définie dans un fichier a dans un fichier b tu dois la faire précéder du mot clé extern dans b.
dans a
dans b
Code : Sélectionner tout - Visualiser dans une fenêtre à part int truc = 0;
Mais, comme on te l'a dit l'utilisation des variables globales est unanimement déconseillée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part extern int truc;
Salut,
Peux-tu nous montré le code qui te pose problème ?
P.S.: s/G/j'ai
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
merci par avance de vôtre aide . C du Borland c++ 2010
Voila les déclarations premier fichier cpp ( programme principal ).
Son IP2Check.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <vcl.h> #pragma hdrstop #include "IP2Check_V2.h" #include "About.h" #include "SNMP.h" #include "Telnet.h" #include "relais.h" #include <string.h> #include <string> #include <iostream.h> #include <sstream> #include <algorithm> // remove(), erase() #include <utilcls.h> //excel ! #include <sstream> #include <vector> using namespace std; using std::string ; TSDIAppForm *SDIAppForm; SNMP snmp ; // déclaration de la class SNMP Telnet telnet ; // class Telnet string Oid_recu; // déclaration --> OK
le 2 iéme fichier cpp relais.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #ifndef IP2Check_V2H #define IP2Check_V2H //---------------------------------------------------------------------------- #include <ComCtrls.hpp> #include <ExtCtrls.hpp> #include <Buttons.hpp> #include <StdCtrls.hpp> #include <Dialogs.hpp> #include <Menus.hpp> #include <Controls.hpp> #include <Forms.hpp> #include <Graphics.hpp> #include <Classes.hpp> #include <Windows.hpp> #include <System.hpp> #include <ActnList.hpp> #include <ImgList.hpp> #include <StdActns.hpp> #include <ToolWin.hpp> #include <Grids.hpp> #include <ValEdit.hpp> //---------------------------------------------------------------------------- class TSDIAppForm : public TForm { __published: //---------------------------------------------------------------------
relais.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 pragma hdrstop #include "global.h" #include "relais.h" #include "IP2Check_V2.h" #include "About.h" #include "SNMP.h" #include "Telnet.h" #include <string.h> #include <string> #include <iostream.h> #include <sstream> #include <algorithm> //--------------------------------------------------------------------------- using namespace std; using std::string; #pragma package(smart_init) //------------------------------
la variable Oid_recu ( 1 iér cpp ) n'est pas visible à l'intérieur de relais.cpp .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef relaisH #define relaisH #include "IP2Check_V2.h" #include "About.h" #include "SNMP.h" #include "Telnet.h" #include "relais.h" #include <string.h> #include <string> #include <iostream.h> #include <sstream> //--------------------------------------------------------------------------- #endif
C surement normal = encapsulation ? Pourtant les deux fichiers sont normalement pour la même class !!! C ce que j'essaye de faire
As tu lu ce que t'as dis ptyxs
Et oui
on va faire avec !
g au moins mieux compris la mécanique du extern ...
merci
Si tes 2 fichiers sont 'pour la même classe'. Pourquoi ne déclares-tu pas ton 'Oid_recu' en tant que variable membre de ta classe ?
Sinon, si tu le veux en variable globale, effectivement 'extern' est la meilleure solution.
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
La plus simple! pas la meilleur...effectivement 'extern' est la meilleure solution
Homer J. Simpson
il y a peut être un peu trop de include ...
Mais c le début des débutants
G pas recopier les codes en entier mais grosse inspiration grâce au forum comme Développez.net
C pour cela qu'il y a en a un peu trop
Je ferais le ménage quand je cernerai mieux le C++ .
Pour dragonjoker59
Si tes 2 fichiers sont 'pour la même classe'. Pourquoi ne déclares-tu pas ton 'Oid_recu' en tant que variable membre de ta classe ?
Pourrais tu préciser ?
merci à tous
Et bien tu dis que tes 2 .cpp sont pour la même classe. Ca laisse supposer que tu as dans un .h la déclaration d'une classe et que pour une raison quelconque tu as séparé son implémentation dans 2 .cpp séparés.
Si c'est bien le cas de figure dans lequel tu te trouves, pourquoi ne mets tu donc pas ton Oid_recu en variable membre de la classe déclarée (TSDIAppForm je pense) dans ton .h ?
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
C bien ce cas . En C# , on peut pour plus de clarté, découper un code en plusieurs .cs . L'ensemble étant pour la même classe .On met " partial class " à chaque déclaration .
G placé dans le .h la déclaration suivante :
extern TSDIAppForm *SDIAppForm;
//----------------------------------------------------------------------------
char data_recu[20]; // pour les valeu num
string Oid_recu; // <-----
bool blocage_snmp=false ;
#endif
G une erreur : E2141 Erreur de syntaxe de déclaration
merci pour ton aide
Euh... Je n'aurais pas fait comme ça.
Si ta variable Oid_recu dépend de ta classe TSDIAppForm, alors mets le en membre de cette classe, de la manière suivante :
Sinon (si Oid_recu n'a strictement rien à voir avec cette classe, ni avec aucune autre d'ailleurs), le mieux est que tu laisses ton code comme il était, avec le 'extern'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class TSDIAppForm : public TForm { private: std::string Oid_recu; };
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Bonjour,
Au risque d'avoir un second avertissement, la classe TSDIAppForm
est crée et déclarée automatiquement par Borland, ainsi
C'est cela qui doit être considéré comme le main pour un utilisateur pas très expérimenté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 class TSDIAppForm : public TForm { __published: TOpenDialog *OpenDialog; TSaveDialog *SaveDialog; TToolBar *ToolBar1; ... ... private: public: virtual __fastcall TSDIAppForm(TComponent *AOwner); }; //---------------------------------------------------------------------------- extern TSDIAppForm *SDIAppForm; // Fin du .h Le .cpp Le constructeur //--------------------------------------------------------------------- __fastcall TSDIAppForm::TSDIAppForm(TComponent *AOwner) : TForm(AOwner) { }
Il n'y a aucun inconvénient à avoir plusieurs .cpp pour une même classe, main naturellement les #include headers.h correspondants doivent figurer dans chacun des .cpp
Si, comme je le pense, l'autre .cpp ressemble à cela
Alors, c'est le vrai main(), mais avant se savoir exactement ce qu'on fait, il ne vaut mieux pas y toucher.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 //--------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------- USEFORM("sdimain.cpp", SDIAppForm); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){ Application->Initialize(); Application->HelpFile = "Jeux_enfants"; Application->Title = "Jeux d'enfants"; Application->CreateForm(__classid(TSDIAppForm), &SDIAppForm); Application->Run(); return 0; } //---------------------------------------------------------------------
Ces 3 lignes sont à la fin du .h
dans votre code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char data_recu[20]; // pour les valeu num string Oid_recu; // <----- bool blocage_snmp=false ;
Vous faites une initialisation dans un .h ce qui est interdit.
Je ne suis pas sûr qu'il y ait un #include <string>
Dernière modification par Invité ; 07/10/2010 à 13h34.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager