OVH Cloud OVH Cloud

Les includes en C++

9 réponses
Avatar
TigrouMeow
Je comprends pas le fonctionnement... je suis programmeur C et j'essai de
faire du C++, et j'ai trouvé sur aucun tutoriel la façon de procéder pour
faire fonctionner du code sur plusieurs fichiers.. voici mon code qui est
très très court :

Voici donc les 3 fichiers du projet :

/* dreadmeow.h */
#include <iostream.h>
#include "dreadmeow.h"

int main()
{
Init.aff();
system("PAUSE");
}

/* init_aff.cpp */
#include <iostream.h>
#include "dreadmeow.h"

int Init::aff()
{
cout << "initialisation affichage..." << endl;
}

#include <iostream.h>
#include "dreadmeow.h"

/* main.cpp */
int main()
{
Init.aff();
system("PAUSE");
}

L'erreur que j'obtiens est :
[Warning] In function `int main()':
\DreadMeow\main.cpp
parse error before `.' token

Donc il a pas trouvé la classe... mais comment cela se fait?
Merci de votre aide.

9 réponses

Avatar
.oO LGV Oo.
erreur de copié/collé je pense : dans le fichier /* dreadmeow.h */ tu nous
donnes le corps du main... bref, je pense avoir compris ton soucis :

int main()
{
Init.aff();
system("PAUSE");
}


Init.aff(); fonctionnerait si aff était une méthode statique (ce qui n'a pas
l'air d'être le cas, mais on n'a pas le code du .h). Il faut donc en fait
créer une instance de ton objet et ensuite appeler la méthode dessus :

Init o;
o.aff();

sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();

à noter que :

Init o;
o.aff();

dans ce dernier cas (aff() statique) marche bien évidemment aussi...

en espérant que ça aide un peu...

Avatar
_M.B._
"TigrouMeow" a écrit
dans le message news: blmvt8$1g9$
Je comprends pas le fonctionnement... je suis programmeur C et j'essai de
faire du C++, et j'ai trouvé sur aucun tutoriel la façon de procéder pour
faire fonctionner du code sur plusieurs fichiers.. voici mon code qui est
très très court :

Voici donc les 3 fichiers du projet :

/* dreadmeow.h */
#include <iostream.h>
#include "dreadmeow.h"

int main()
{
Init.aff();
system("PAUSE");
}

/* init_aff.cpp */
#include <iostream.h>
#include "dreadmeow.h"

int Init::aff()
{
cout << "initialisation affichage..." << endl;
}

#include <iostream.h>
#include "dreadmeow.h"

/* main.cpp */
int main()
{
Init.aff();
system("PAUSE");
}

L'erreur que j'obtiens est :
[Warning] In function `int main()':
DreadMeowmain.cpp
parse error before `.' token

Donc il a pas trouvé la classe... mais comment cela se fait?
Merci de votre aide.



Moi non plus, je ne l'ai pas trouvée. Elle est ou ?

MB

Avatar
TigrouMeow
Merci beaucoup, en effet il fallait déclarer en tant que statique ! Et... je
savais tout simplement pas que ça existait ;) Merci de ton aide encore :)

erreur de copié/collé je pense : dans le fichier /* dreadmeow.h */ tu nous
donnes le corps du main... bref, je pense avoir compris ton soucis :

int main()
{
Init.aff();
system("PAUSE");
}


Init.aff(); fonctionnerait si aff était une méthode statique (ce qui n'a
pas

l'air d'être le cas, mais on n'a pas le code du .h). Il faut donc en fait
créer une instance de ton objet et ensuite appeler la méthode dessus :

Init o;
o.aff();

sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();

à noter que :

Init o;
o.aff();

dans ce dernier cas (aff() statique) marche bien évidemment aussi...

en espérant que ça aide un peu...





Avatar
.oO LGV Oo.
fais quand meme attention à bien saisir tout le sens de éléments
statiques... sinon tu risques fort d'etre amené à déclarer toutes tes
methodes/attributs statiques, et à faire du C encapsulé dans des classes,
juste pour la forme, et ça c'est mauvais dans le sens où on s'éloigne de
l'optique objet du C++...


"TigrouMeow" a écrit
dans le message de news:bln41v$e7b$
Merci beaucoup, en effet il fallait déclarer en tant que statique ! Et...
je

savais tout simplement pas que ça existait ;) Merci de ton aide encore :)

erreur de copié/collé je pense : dans le fichier /* dreadmeow.h */ tu
nous


donnes le corps du main... bref, je pense avoir compris ton soucis :

int main()
{
Init.aff();
system("PAUSE");
}


Init.aff(); fonctionnerait si aff était une méthode statique (ce qui n'a
pas

l'air d'être le cas, mais on n'a pas le code du .h). Il faut donc en
fait


créer une instance de ton objet et ensuite appeler la méthode dessus :

Init o;
o.aff();

sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();

à noter que :

Init o;
o.aff();

dans ce dernier cas (aff() statique) marche bien évidemment aussi...

en espérant que ça aide un peu...









Avatar
Jonathan Mcdougall
Je comprends pas le fonctionnement... je suis programmeur C et j'essai de
faire du C++, et j'ai trouvé sur aucun tutoriel la façon de procéder pour
faire fonctionner du code sur plusieurs fichiers.. voici mon code qui est
très très court :


Achète un livre, il te sera plus facile de comprendre

Voici donc les 3 fichiers du projet :


Je crois que tu veux faire trop de choses en même temps.

/* dreadmeow.h */
#include <iostream.h>


Non standard

# include <iostream>

#include "dreadmeow.h"

int main()
{
Init.aff();


Je suppose que 'Init' est le nom de ta classe, mais il aurait
été intéressant que tu nous en donnes la définition.

Elle doit ressembler à

class Init
{
public:
void aff();
};

Dans ce cas, aff() est une fonction membre de la classe Init;
il te faut donc une instance de cette classe :

Init o;

Avec l'object 'o' tu peux maintenant accéder à la fonction aff() :

o.aff();

system("PAUSE");


Ceci n'est pas portable, sur mon système, PAUSE fait exploser
l'écran (ça fait 8 fois que je me fais prendre).

}

/* init_aff.cpp */
#include <iostream.h>


Non standard.

#include "dreadmeow.h"

int Init::aff()
{
cout << "initialisation affichage..." << endl;
}

#include <iostream.h>
#include "dreadmeow.h"

/* main.cpp */
int main()
{
Init.aff();
system("PAUSE");
}

L'erreur que j'obtiens est :
[Warning] In function `int main()':
DreadMeowmain.cpp
parse error before `.' token

Donc il a pas trouvé la classe...


Non, il a trouvé la classe, mais ta syntaxe est illégale.

Je crois qu'il te faut lire un peu sur la terminologie (classe,
objet, fonction, instance...).

mais comment cela se fait?


# include "taclasse.h"


int main()
{
TaClasse o;

o.ta_fonction();
}


Jonathan

Avatar
Michaël Monerau
.oO LGV Oo. wrote:
sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();


Non, une fonction statique peut être appelée par :
Init::aff ();

Car Init n'est pas un objet. C'est le nom de la classe. On ne peut donc pas
la déférencer comme on le ferait avec une référence (même si "déréférencer"
une référence ne sonne pas très bien... Un meilleur terme vous vient à
l'esprit ?).

Avatar
Christophe Lephay
".oO LGV Oo." a écrit dans le message de
news:blnbiu$qqe$
fais quand meme attention à bien saisir tout le sens de éléments
statiques... sinon tu risques fort d'etre amené à déclarer toutes tes
methodes/attributs statiques, et à faire du C encapsulé dans des classes,
juste pour la forme, et ça c'est mauvais dans le sens où on s'éloigne de
l'optique objet du C++...


"TigrouMeow" a écrit
dans le message de news:bln41v$e7b$
Merci beaucoup, en effet il fallait déclarer en tant que statique !
Et...


je
savais tout simplement pas que ça existait ;) Merci de ton aide encore
:)



erreur de copié/collé je pense : dans le fichier /* dreadmeow.h */ tu
nous


donnes le corps du main... bref, je pense avoir compris ton soucis :

int main()
{
Init.aff();
system("PAUSE");
}


Init.aff(); fonctionnerait si aff était une méthode statique (ce qui
n'a



pas
l'air d'être le cas, mais on n'a pas le code du .h). Il faut donc en
fait


créer une instance de ton objet et ensuite appeler la méthode dessus :

Init o;
o.aff();

sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();

à noter que :

Init o;
o.aff();

dans ce dernier cas (aff() statique) marche bien évidemment aussi...

en espérant que ça aide un peu...




tu devrais répondre plutôt en fin de message, par ce que ça devient
illisible dès qu'on dépasse deux posts...

Chris




Avatar
.oO LGV Oo.
"Christophe Lephay" a écrit dans le message
de news:blne0f$o9e$
".oO LGV Oo." a écrit dans le message de
news:blnbiu$qqe$
fais quand meme attention à bien saisir tout le sens de éléments
statiques... sinon tu risques fort d'etre amené à déclarer toutes tes
methodes/attributs statiques, et à faire du C encapsulé dans des
classes,


juste pour la forme, et ça c'est mauvais dans le sens où on s'éloigne de
l'optique objet du C++...


"TigrouMeow" a écrit
dans le message de news:bln41v$e7b$
Merci beaucoup, en effet il fallait déclarer en tant que statique !
Et...


je
savais tout simplement pas que ça existait ;) Merci de ton aide encore
:)



erreur de copié/collé je pense : dans le fichier /* dreadmeow.h */
tu




nous
donnes le corps du main... bref, je pense avoir compris ton soucis :

int main()
{
Init.aff();
system("PAUSE");
}


Init.aff(); fonctionnerait si aff était une méthode statique (ce qui
n'a



pas
l'air d'être le cas, mais on n'a pas le code du .h). Il faut donc en
fait


créer une instance de ton objet et ensuite appeler la méthode dessus
:





Init o;
o.aff();

sinon, tu peux faire comme je disais une méthode statique (mais
est-ce




vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une
instance




particulière et peut donc etre appelée avec la syntaxe :

Init.aff();

à noter que :

Init o;
o.aff();

dans ce dernier cas (aff() statique) marche bien évidemment aussi...

en espérant que ça aide un peu...




tu devrais répondre plutôt en fin de message, par ce que ça devient
illisible dès qu'on dépasse deux posts...

Chris




à oui, pardon, je n'avais pas fais attention... je pensais qu'il était plus
intéressant pour les personnes qui suivent les discussions d'avoir les
dernières infos en tête, mais comme tu le dis, ça deviens vite illisible





Avatar
.oO LGV Oo.
"Michaël Monerau" a écrit dans le message de
news:KRFfb.44736$
.oO LGV Oo. wrote:
sinon, tu peux faire comme je disais une méthode statique (mais est-ce
vraiment le but ? ...) du style :

class Init
{
public:
static void aff() { /* code */ }
};

et comme elle statique, elle ne dépend pas du contexte d'une instance
particulière et peut donc etre appelée avec la syntaxe :

Init.aff();


Non, une fonction statique peut être appelée par :
Init::aff ();

Car Init n'est pas un objet. C'est le nom de la classe. On ne peut donc
pas

la déférencer comme on le ferait avec une référence (même si
"déréférencer"

une référence ne sonne pas très bien... Un meilleur terme vous vient à
l'esprit ?).




finement noté ;) j'ai tapé cette énormité dans le "feu de l'action" LOL ...
et au passage, il me semble que le :: s'appelle l'opérateur de résolution de
portée