OVH Cloud OVH Cloud

Classe et visual c++

17 réponses
Avatar
Daniel
Bonsoir,


J'ai fait un programme simple en visual c++ (projet MFC exe) puis ajouté
1 bouton.
J'ai ensuite ecrit une classe:

class MyClass {



MyClass::MyClass(char *fileName){ // Constructeur

}

MyClass::~MyClass(); // Destructeur de la classe

};


J'ai ajouté cette classe MyClass.cpp dans le projet.
Ensuite j'ai ajouté une fonction sur l'appuie du bouton et dans cet
fonction instancié la classe:
MyClass myClass = new Myclass;

et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?

Merci d'avance
Daniel

10 réponses

1 2
Avatar
jalina
Bonsoir,


J'ai fait un programme simple en visual c++ (projet MFC exe) puis ajouté
1 bouton.
J'ai ensuite ecrit une classe:

class MyClass {



MyClass::MyClass(char *fileName){ // Constructeur

}

MyClass::~MyClass(); // Destructeur de la classe

};


J'ai ajouté cette classe MyClass.cpp dans le projet.
Ensuite j'ai ajouté une fonction sur l'appuie du bouton et dans cet
fonction instancié la classe:
MyClass myClass = new Myclass;


MyClass myClass = new MyClass("toto"); // voir déf. du constructeur


et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?

Merci d'avance
Daniel


Avatar
jalina
Bonsoir,


J'ai fait un programme simple en visual c++ (projet MFC exe) puis ajouté
1 bouton.
J'ai ensuite ecrit une classe:

class MyClass {



MyClass::MyClass(char *fileName){ // Constructeur

}

MyClass::~MyClass(); // Destructeur de la classe

};


J'ai ajouté cette classe MyClass.cpp dans le projet.
Ensuite j'ai ajouté une fonction sur l'appuie du bouton et dans cet
fonction instancié la classe:
MyClass myClass = new Myclass;




MyClass myClass("toto");

ou

MyClass *myClass = new MyClass("toto");



et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?

Merci d'avance
Daniel




Avatar
kanze
Daniel wrote:

J'ai fait un programme simple en visual c++ (projet MFC exe)
puis ajouté 1 bouton. J'ai ensuite ecrit une classe :

class MyClass {

MyClass::MyClass(char *fileName){ // Constructeur
}

MyClass::~MyClass(); // Destructeur de la classe
};

J'ai ajouté cette classe MyClass.cpp dans le projet.


Ce qui fait... A priori, je crois qu'ajouter un fichier .cpp à
un projet ne fait que de l'ajouter au fichier de make, de façon
à le compiler et à linker l'objet ainsi généré dans le produit
du projet (exécutable, DLL, etc.). (Mais je ne suis pas sûr ; je
ne me sert pas de l'environement Visual Studios.)

Le contenu d'un fichier source n'est pas a priori disponible à
d'autres sources, au moins que VC++ fasse quelque chose de
particulier. Typiquement, ce qu'il faut faire, c'est de mettre
la définition de la classe dans un en-tête (.hpp, la plupart du
temps sous Windows), qu'on inclut dans chaque source qui va s'en
servir. Et la définition des fonctions non-inline de la classe
dans le .cpp (qui lui aussi inclura le .hpp), qu'on ajoute au
make.

Ensuite j'ai ajouté une fonction sur l'appuie du bouton et
dans cet fonction instancié la classe:


Fonction dans le .cpp qui contient la définition de la classe ?
Sinon, le compilateur n'a aucune possibilité de savoir que la
classe existe.

MyClass myClass = new Myclass;

et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?


Utiliser les en-têtes.

Comme j'ai dit, je ne connais pas bien Visual Studios, mais je
crois que c'est un wrapper assez mince autour des fonctionalités
classiques : éditeur, compilateur, éditeur de liens, make, etc.
et qu'ils n'apportent rien d'essentiel par rapport à ces
utilitaires. (À l'encontre de Visual Age, par exemple, où on
pouvait réelement se passer des en-têtes)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Daniel


Bonsoir,


J'ai fait un programme simple en visual c++ (projet MFC exe) puis ajouté
1 bouton.
J'ai ensuite ecrit une classe:

class MyClass {



MyClass::MyClass(char *fileName){ // Constructeur

}

MyClass::~MyClass(); // Destructeur de la classe

};


J'ai ajouté cette classe MyClass.cpp dans le projet.
Ensuite j'ai ajouté une fonction sur l'appuie du bouton et dans cet
fonction instancié la classe:
MyClass myClass = new Myclass;





MyClass myClass("toto");

ou

MyClass *myClass = new MyClass("toto");



et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?

Merci d'avance
Daniel




Bonsoir,

MyClass myClass("toto");

ou

MyClass *myClass = new MyClass("toto");


ne fonctionne pas non plus

Merci



Avatar
Daniel
Bonsoir,

Merci pour la réponse, Vous avez mis le doigt sur le problème.
En effet je n'arrive pas meme avec une fonction.h à faire reconnaitre
dans l'environnement c++ une fonction crée autrement que l'outils visual.

Daniel


Daniel wrote:


J'ai fait un programme simple en visual c++ (projet MFC exe)
puis ajouté 1 bouton. J'ai ensuite ecrit une classe :



class MyClass {



MyClass::MyClass(char *fileName){ // Constructeur
}

MyClass::~MyClass(); // Destructeur de la classe
};



J'ai ajouté cette classe MyClass.cpp dans le projet.



Ce qui fait... A priori, je crois qu'ajouter un fichier .cpp à
un projet ne fait que de l'ajouter au fichier de make, de façon
à le compiler et à linker l'objet ainsi généré dans le produit
du projet (exécutable, DLL, etc.). (Mais je ne suis pas sûr ; je
ne me sert pas de l'environement Visual Studios.)

Le contenu d'un fichier source n'est pas a priori disponible à
d'autres sources, au moins que VC++ fasse quelque chose de
particulier. Typiquement, ce qu'il faut faire, c'est de mettre
la définition de la classe dans un en-tête (.hpp, la plupart du
temps sous Windows), qu'on inclut dans chaque source qui va s'en
servir. Et la définition des fonctions non-inline de la classe
dans le .cpp (qui lui aussi inclura le .hpp), qu'on ajoute au
make.


Ensuite j'ai ajouté une fonction sur l'appuie du bouton et
dans cet fonction instancié la classe:



Fonction dans le .cpp qui contient la définition de la classe ?
Sinon, le compilateur n'a aucune possibilité de savoir que la
classe existe.


MyClass myClass = new Myclass;



et j'ai toujours MyClass inconnu, alors qu'elle apparait bien.
Comment faire pour que c++ la reconnaisse ?



Utiliser les en-têtes.

Comme j'ai dit, je ne connais pas bien Visual Studios, mais je
crois que c'est un wrapper assez mince autour des fonctionalités
classiques : éditeur, compilateur, éditeur de liens, make, etc.
et qu'ils n'apportent rien d'essentiel par rapport à ces
utilitaires. (À l'encontre de Visual Age, par exemple, où on
pouvait réelement se passer des en-têtes)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
Sylvain
Daniel wrote on 26/04/2006 18:33:
Bonsoir,

Merci pour la réponse, Vous avez mis le doigt sur le problème.
En effet je n'arrive pas meme avec une fonction.h à faire reconnaitre
dans l'environnement c++ une fonction crée autrement que l'outils visual.


hmmm, ça n'a aucun sens tout ça -- "cela manque fortement de précision
et je doute que nous puissions vous aider plus avant" ...

lorsque tu utilises le dialog wizard et dbl-clique sur un bouton, ou
lorsque via le class wizard tu sélectionnes ton bouton (son ID) et
dbl-clique sur ONCLICKED, studio te génère du code pour cette action
(une methode OnLeNomDuBonton) et insère ses macros dans les message-maps
distribuant les msgs.

pour autant si tu veux réaliser, dans cette méthode, une opération
nécessitant le classe Toto - implémentée dans toto.cpp et déclarée dans
toto.h - tu dois 1) inclure des 2 fichiers dans le projet (surtout le
.cpp) et 2) insérer un #include "toto.h" au haut du .cpp du fichier qui
contient ton dialog ou ton j'sais-pas-quoi qui contient le bouton
sus-décrit (je dis "en haut" mais pas trop, si tu le mets avant
"stdafx.h" le compilo chouignera que windows.h doit être inclus avant;
donc disons juste après le bloc d'include déjà présent).

Sylvain.

Avatar
kanze
Sylvain wrote:
Daniel wrote on 26/04/2006 18:33:

Merci pour la réponse, Vous avez mis le doigt sur le
problème. En effet je n'arrive pas meme avec une fonction.h
à faire reconnaitre dans l'environnement c++ une fonction
crée autrement que l'outils visual.


hmmm, ça n'a aucun sens tout ça -- "cela manque fortement de
précision et je doute que nous puissions vous aider plus
avant" ...


C'est sûr qu'il avait un petit problème de langage dans son
posting original : « J'ai ajouté cette classe MyClass.cpp... ».
Mais je le trouve raisonable de croire ce qu'il voulait dire,
c'est qu'il a ajouté un fichier MyClass.cpp au projet, et que
ce fichier contenait la définition de la classe MyClass, ainsi
que son implémentation.

Je me permets donc un petit rappel du vocabulaire propre à C++.
(Je crois que tu le sais, mais Daniel, peut-être pas.) En C++,
on distingue entre définition et declaration. Une définition
crée (définit) quelque chose, une declaration qui n'est pas une
définition dit que quelque chose existe, sans la définir ou le
créer. (Techniquement, une définition est toujours une
declaration -- tu ne peux pas créer quelque chose sans faire
savoir qu'il existe. Souvent, par abus, on dit declaration quand
on ne veut parler que des declarations qui ne sont pas des
définitions.)

Donc, par exemple :
int i ;
est une définition, il crée une instance d'une variable qui
s'appelle i, et qui a le type int. En revanche,
extern int i ;
n'est qu'une declaration -- il dit au compilateur qu'il existe,
quelque part, une variable i de type int, sans la créer.

En ce qui concerne les classes,
class Toto ;
n'est qu'une declaration -- il dit au compilateur qu'il existe
une classe du nom Toto, sans la définir. En revanche :
class Toto { /* ... */ } ;
est une définition de la classe.

Ce qui se trouve dans la définition de la classe, ce sont des
declarations -- il faut bien qu'il y a une définition des
fonctions membres ailleurs. C'est ce qu'on appelle en général
l'implémentation de la classe : la définition des membres qui
ont été declarés dans la classe.

Maintenant, il faut savoir que le C++ traite les classes, et les
objets et les fonctions un peu différemment en ce qui concerne
les declarations et les définitions. Quand tu as une declaration
d'une variable ou d'une fonction, le type associé au nom est
complet -- tu peux donc l'utiliser sans problème dans ton code,
exactement comme s'il y a été défini, à condition de fournir une
définition (et une seule) quelque part. En revanche, quand tu
déclares une classe, sans la définir, le type est incomplet --
c'est le type même qui n'est pas défini. Tu ne peux en faire que
peu de chose -- pratiquement, tu peux en manipuler des pointeurs
ou des références, mais c'est tout. Il faut donc que chaque
module (.cpp) qui utilise la classe en est la définition. (Et on
peut répéter la définition dans autant de sources qu'on veut --
à condition que chaque répétion soit identique.)

En C++, la façon de faire ces répétions, c'est avec l'inclusion
d'un fichier d'en-tête (typiquement un .hpp sous Windows). Quand
tu écris « #include "MyClass.hpp" » dans une source, le
compilateur fait en fait un espèce de copier/coller, et insère
la texte de MyClass.hpp là à la place de l'include. Pour définir
une classe, il est donc coutume de créer deux fichiers, un
fichier MyClass.hpp, avec la définition de la classe, et un
fichier MyClass.cpp, avec l'implémentation, c-à-d la définition
des fonctions membre (et des variables statiques membre).
Ensuite, tu inclus MyClass.hpp dans toutes les .cpp qui doivent
se servir de la classe, et tu compiles MyClass.cpp (qui doit lui
aussi inclure MyClass.hpp), et tu linkes l'objet généré.

Je ne connais pas bien Visual Studios, mais je suis assez sûr
que quand tu ajoutes un fichier .cpp à un projet, il modifie ces
fichiers internes (make, etc.) pour que le .cpp soit compilé, et
que l'objet correspondant soit ajouté au link. Je suis aussi
très certain qu'il ne modifie pas les autres fichiers existants
pour y ajouter un include d'un .hpp ; ça, c'est à toi de le
faire. Ce que je ne sais pas, c'est s'il faut ajouter le .hpp
explicitement au projet ou non -- du moment que tu as fait
l'include, le compilateur sait bien le rétrouver, mais j'imagine
qu'il y a d'autres fonctionnalités de l'IDE qui existe qu'il en
connaisse l'existance.

lorsque tu utilises le dialog wizard et dbl-clique sur un
bouton, ou lorsque via le class wizard tu sélectionnes ton
bouton (son ID) et dbl-clique sur ONCLICKED, studio te génère
du code pour cette action (une methode OnLeNomDuBonton) et
insère ses macros dans les message-maps distribuant les msgs.


Si on utilise un wizard pour créer quelque chose, je suppose
qu'il fasse tout ce qu'il faut. Si j'ai bien compris, ce n'était
pas le cas ici. Et on ne peut pas utiliser les wizards pour
tout -- il y a toujours une partie de l'application qu'il faut
écrire à la main.

S'il utilise les wizard, aussi, il ne s'agit plus du C++ ; il y
a un autre groupe pour ça (fr.comp.windows.programming, ou
quelque chose du genre).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Sylvain
kanze wrote on 27/04/2006 09:50:

En C++, la façon de faire ces répétions, c'est avec l'inclusion
d'un fichier d'en-tête (typiquement un .hpp sous Windows).


.h suffit - les headers utilisateurs utilisent cette extension que les
fichiers sources sont générés par l'IDE
.hpp est "reconnu" par l'IDE (signifiant qu'il les ignore comme les .h)

Je ne connais pas bien Visual Studios, mais je suis assez sûr
que quand tu ajoutes un fichier .cpp à un projet, il modifie ces
fichiers internes (make, etc.) pour que le .cpp soit compilé, et
que l'objet correspondant soit ajouté au link.


je te confirme (il gère un fichier dit "projet", optionnellement génère
un makefile selon nmake non compatible make).

Je suis aussi très certain qu'il ne modifie pas les autres
fichiers existants pour y ajouter un include d'un .hpp ;


sauf cas particulier, ajout de class ATL dans un projet implémémentant
la factory de ces composants - c'est du 100% MS spécifique.

pour y ajouter un include d'un .hpp ; ça, c'est à toi de le
faire. Ce que je ne sais pas, c'est s'il faut ajouter le .hpp
explicitement au projet ou non -- [...]


l'utilisateur peut les insérer, l'IDE (le gestionnaire de dépendances)
les insère (les liste simplement) s'ils ne sont pas présents.

S'il utilise les wizard, aussi, il ne s'agit plus du C++ ; il y
a un autre groupe pour ça (fr.comp.windows.programming, ou
quelque chose du genre).


je suis convaincu que sa question était "qu'est ce qui se passe quand je
clique au hasard sans comprendre dans Studio..." et que toute réponse
possible (tutorial d'utilisation de l'IDE ou guide plus avancé) est à
chercher chez microsoft (presse, par exemple) et non ici.

Sylvain.

Avatar
Daniel
Bonsoir,

Merci à tous pour votre aide et les explications.
Maintenant ça link sans problème.
En fait au départ j'avais crée une classe MyClass.cpp et pensais qu'elle
etait automatiquement reconnue puisque je la voyait dans la fenetre
Class de l'environnement.

Bonne soirée

Daniel


kanze wrote on 27/04/2006 09:50:


En C++, la façon de faire ces répétions, c'est avec l'inclusion
d'un fichier d'en-tête (typiquement un .hpp sous Windows).



.h suffit - les headers utilisateurs utilisent cette extension que les
fichiers sources sont générés par l'IDE
.hpp est "reconnu" par l'IDE (signifiant qu'il les ignore comme les .h)

Je ne connais pas bien Visual Studios, mais je suis assez sûr
que quand tu ajoutes un fichier .cpp à un projet, il modifie ces
fichiers internes (make, etc.) pour que le .cpp soit compilé, et
que l'objet correspondant soit ajouté au link.



je te confirme (il gère un fichier dit "projet", optionnellement génère
un makefile selon nmake non compatible make).

Je suis aussi très certain qu'il ne modifie pas les autres
fichiers existants pour y ajouter un include d'un .hpp ;



sauf cas particulier, ajout de class ATL dans un projet implémémentant
la factory de ces composants - c'est du 100% MS spécifique.

pour y ajouter un include d'un .hpp ; ça, c'est à toi de le
faire. Ce que je ne sais pas, c'est s'il faut ajouter le .hpp
explicitement au projet ou non -- [...]



l'utilisateur peut les insérer, l'IDE (le gestionnaire de dépendances)
les insère (les liste simplement) s'ils ne sont pas présents.

S'il utilise les wizard, aussi, il ne s'agit plus du C++ ; il y
a un autre groupe pour ça (fr.comp.windows.programming, ou
quelque chose du genre).



je suis convaincu que sa question était "qu'est ce qui se passe quand je
clique au hasard sans comprendre dans Studio..." et que toute réponse
possible (tutorial d'utilisation de l'IDE ou guide plus avancé) est à
chercher chez microsoft (presse, par exemple) et non ici.

Sylvain.



Avatar
Sylvain
Daniel wrote on 27/04/2006 17:56:

En fait au départ j'avais crée une classe MyClass.cpp et pensais qu'elle
etait automatiquement reconnue puisque je la voyait dans la fenetre
Class de l'environnement.



ben ouais, on écrit une classe et on pense qu'elle est "automatiquement"
et spontanément connue de la terre entière (puisqu'elle existe, puisque
je la vois), ben non, cela ne suffit pas tout à fait.

Sylvain.

1 2