OVH Cloud OVH Cloud

Question de débutant sur les fichiers en-tête .h

32 réponses
Avatar
Edwin Groulala
Bonjour,

Je débute avec c++. Je voudrais structurer mon programme en fichiers .h
et fichier .cc.

Dans un fichier manipstr.h j'ai déclaré une fonction convertToUpperCase
(string)

Le début de manipstr.h est le suivant:

#include <string>

#ifndef MANIPSTR_H
#define MANIPSTR_H

string convertToUpperCase (string);

#endif

Lors de la compilation, j'obtiens le message suivant:

manipstr.h:6: error: `string' was not declared in this scope

Apparemment la ligne "#include <string>" dans mon fichier manipstr.h n'a
servi à rien...

Comment dois-je faire pour pouvoir déclarer dans manipstr.h des
fonctions utilisant la classe string ? (quelle ligne dois-je écrire dans
mon fichier .h)

Désolé de poser une question aussi basique mais je n'ai pas trouvé la
réponse via google.

Merci d'avance pour votre aide.

Groulala

10 réponses

1 2 3 4
Avatar
Hamiral
Lors de la compilation, j'obtiens le message suivant:

manipstr.h:6: error: `string' was not declared in this scope

Apparemment la ligne "#include <string>" dans mon fichier manipstr.h n'a
servi à rien...


sisi :)
string fait partie du namespace std
Donc soit tu l'utilises par std::string (à la place de string tout seul)
soit tu mets using namespace std; après le #include<string>


--
Hamiral

Avatar
Loïc Joly
Hamiral wrote:

Lors de la compilation, j'obtiens le message suivant:

manipstr.h:6: error: `string' was not declared in this scope

Apparemment la ligne "#include <string>" dans mon fichier manipstr.h
n'a servi à rien...



sisi :)
string fait partie du namespace std
Donc soit tu l'utilises par std::string (à la place de string tout seul)
soit tu mets using namespace std; après le #include<string>


Comme il s'agit d'un fichier en-tête, y placer un using namespace std
serait du plus mauvais goût, il ne reste donc que la première solution.

--
Loïc


Avatar
Sayajin
"Loïc Joly" a écrit dans le message de
news:41b4c47f$0$3426$
Hamiral wrote:

Lors de la compilation, j'obtiens le message suivant:

manipstr.h:6: error: `string' was not declared in this scope

Apparemment la ligne "#include <string>" dans mon fichier manipstr.h
n'a servi à rien...



sisi :)
string fait partie du namespace std
Donc soit tu l'utilises par std::string (à la place de string tout seul)
soit tu mets using namespace std; après le #include<string>


Comme il s'agit d'un fichier en-tête, y placer un using namespace std
serait du plus mauvais goût, il ne reste donc que la première solution.

Ce n'est pas "plus pratique" que de faire toujours std::string ?




Avatar
Andre Heinen
On Tue, 7 Dec 2004 12:48:18 +0100, "Sayajin"
wrote:

"Loïc Joly" a écrit dans le message de
news:41b4c47f$0$3426$

Comme il s'agit d'un fichier en-tête, y placer un using namespace std
serait du plus mauvais goût, il ne reste donc que la première solution.


Ce n'est pas "plus pratique" que de faire toujours std::string ?


Quand tu commenceras à avoir des collisions de noms, tu trouveras
ça moins pratique... ;-)

Si vraiment tu as une fonction où il y a trop de std:: le mieux
est de mettre une directive using locale à la fonction:

void f() {
using namespace std;
...
}

De cette manière, la directive using n'a pas d'effet à
l'extérieur de f().

Si vraiment tu veux une directive using globale, tu peux la
mettre dans un .cpp, mais jamais dans un .h. Si tu enfreins
cette règle, tout fichier source qui inclut ledit header inclura
aussi la directive using, même si tu ne le désires pas, et même
si tu as des collisions de noms.

=> jamais de using dans un .h

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz


Avatar
Gabriel Dos Reis
Andre Heinen writes:

| => jamais de using dans un .h

Vraiment ?

-- Gaby
Avatar
Andre Heinen
On 07 Dec 2004 14:20:48 +0100, Gabriel Dos Reis
wrote:

Vraiment ?


Donne-nous donc un exemple, au lieu de poser des énigmes...

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

Avatar
Gabriel Dos Reis
Andre Heinen writes:

| On 07 Dec 2004 14:20:48 +0100, Gabriel Dos Reis
| wrote:
|
| >Vraiment ?
|
| Donne-nous donc un exemple, au lieu de poser des énigmes...

c'est toi qui énonces des règles. Tu dois pouvoir répondre aux
questions qu'elles soulèvent -- autrement c'est de l'intégrisme.

-- Gaby
Avatar
Sayajin
"Gabriel Dos Reis" a écrit dans le message de
news:
Andre Heinen writes:

| On 07 Dec 2004 14:20:48 +0100, Gabriel Dos Reis
| wrote:
|
| >Vraiment ?
|
| Donne-nous donc un exemple, au lieu de poser des énigmes...

c'est toi qui énonces des règles. Tu dois pouvoir répondre aux
questions qu'elles soulèvent -- autrement c'est de l'intégrisme.



Nous y voilà : du terrorisme maintenant ! Quelle réparti :o)

Avatar
Gabriel Dos Reis
"Sayajin" writes:

| "Gabriel Dos Reis" a écrit dans le message de
| news:
| > Andre Heinen writes:
| >
| > | On 07 Dec 2004 14:20:48 +0100, Gabriel Dos Reis
| > | wrote:
| > |
| > | >Vraiment ?
| > |
| > | Donne-nous donc un exemple, au lieu de poser des énigmes...
| >
| > c'est toi qui énonces des règles. Tu dois pouvoir répondre aux
| > questions qu'elles soulèvent -- autrement c'est de l'intégrisme.
| >
|
| Nous y voilà : du terrorisme maintenant !

Vraiment ?

| Quelle réparti :o)

J'aime comprendre les règles. En particulier, lorsqu'elles semblent en
contradiction avec d'autres pratiques saines, comme
« namespace composition », documentée dans TC++PL3.

-- Gaby
Avatar
Andre Heinen
On 07 Dec 2004 17:12:29 +0100, Gabriel Dos Reis
wrote:

c'est toi qui énonces des règles. Tu dois pouvoir répondre aux
questions qu'elles soulèvent -- autrement c'est de l'intégrisme.


C'est vrai, c'est pour ça que tu réponds si souvent "vraiment?"
ou "ah oui?" ? :-)

Pour répondre à ta question, je ne vois pas d'exemple où ce soit
une bonne idée de mettre une directive using dans un en-tête.
Bien sûr, ce n'est pas parce que je n'en vois pas qu'il ne peut
pas en exister.

Contrairement à la grammaire du langage, les règles relatives au
style de programmation ne sont jamais impératives. Lorsque je
dis "jamais de using dans un .h", je sous-entends "à moins que tu
ne saches vraiment ce que tu fais, et que dans ton cas précis il
y ait une bonne raison de faire autrement". Comme c'est un peu
long, je ne l'écris pas tout le temps, d'autant plus que je
pensais que c'était évident.

Pas d'accord?

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

1 2 3 4