Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1218 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++ MFC] Faire correspondre deux classes ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Visual C++ MFC] Faire correspondre deux classes ?

n°262395
xc0r
Posté le 05-12-2002 à 20:40:19  profilanswer
 

Bonjour !
J ai un petit probleme tout simple mais que je n arrive pas a resoudre en VC....
Voila j ai un donc ma classe
class CChildView : public CWnd
{
  int toto;
 [...]
}
 
et j ai dans un autre .h une classe de type  
class MonProg : public Prog
{
  int tata;
  [...]
}
 
Seulement dans une fonction MonProg::init() j aimerais utiliser le "toto" de ma class CChieldView ....
 
Mais je n arrive pas a recuperer cette class ...
Je pensais a faire une fonction amie mais .... elle veut pas de moi :)
 
Si qqn peut me montrer un exemple CONCRET de comment je peux faire ca (je suis pas un fervent utilisateur de VC j en ai juste l'obligation dans l'immediat) ?
Meme une methode bourrin je crois que je suis plus a ca pret ! :))
 
Merci!
 
Xc0r
En vous remerciant :)

mood
Publicité
Posté le 05-12-2002 à 20:40:19  profilanswer
 

n°262413
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-12-2002 à 21:08:49  profilanswer
 

ben soit tu herites et toto est protected, soit toto est public, soit tu muni ta classe de methodes ttoSet() et totoGet(). ou alors tu as la solution des class friend, mais c'est une solution si conceptuellement tes classes doivent vraiment un lien etroit


---------------
du bon usage de rand [C] / [C++]
n°262414
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 05-12-2002 à 21:12:13  profilanswer
 

J'ai jamais compris d'ailleurs la raison d'être des classes amies... Je pense que c'est un concept vraiment anti-objet !
Si on munit la classe de fonctions get() et set(), quel est donc l'intérêt des fonctions amies ?
Le C++ a peu d'aberrations, mais je trouve celle-ci vraiment énorme...


---------------
J'ai un string dans l'array (Paris Hilton)
n°262416
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-12-2002 à 21:14:05  profilanswer
 

Harkonnen a écrit a écrit :

J'ai jamais compris d'ailleurs la raison d'être des classes amies... Je pense que c'est un concept vraiment anti-objet !
Si on munit la classe de fonctions get() et set(), quel est donc l'intérêt des fonctions amies ?
Le C++ a peu d'aberrations, mais je trouve celle-ci vraiment énorme...




 
ben je suis d'accord avec toi. j'ai jamais trouvé de conception ou 2 classes doivent etre amies. ca casse completement l'abastraction et l'encapsulation  :pfff:


---------------
du bon usage de rand [C] / [C++]
n°262420
xc0r
Posté le 05-12-2002 à 21:17:00  profilanswer
 

bon heu ....
je vais faire tout mon programme dans la CChieldView ca sera plus simple parce que la vous parlez coreen pour moi :)
 
Merci quand meme !
 
Xc0r

n°262421
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-12-2002 à 21:19:34  profilanswer
 

fais ceci: muni ta classe ChildView de 2 methodes:

  • void setToto(typetoto newtoto) qui permet de modifier le membre toto
  • typetoto getToto() qui retourne la valeur du membre toto


Message édité par Taz@PPC le 05-12-2002 à 21:20:27

---------------
du bon usage de rand [C] / [C++]
n°262534
xc0r
Posté le 05-12-2002 à 22:49:55  profilanswer
 

Merci monsieur j essayerais ca plus tard dans la soiree ou demain matin !
 
Encore merci ! :)))
Ca fait tout plaisir d avoir une reponse !
 
Xc0r

n°262548
Kristoph
Posté le 05-12-2002 à 23:02:05  profilanswer
 

Les classes amies sont le seul moyen de fournir en C++ un controle plus précis sur les autorisations d'access à tes classes. En gros, ta classe A a une interface publique, mais tu veux que seul la classe B aie access à l'interface semi publique qui lui est réservée en fait. Donc soit tu met la deuxième interface en public aussi, soit la classe B et amie de la classe A.
 
Je prefère la deuxième solution si j'ai le controle de A et de B en même temps, mais si je ne controle pas ce que le reste du prog fait avec A

n°262622
xc0r
Posté le 06-12-2002 à 00:05:12  profilanswer
 

Heu j ai fait une betise la ?
(.h)

Code :
  1. class CYouhouApp : public CWinApp
  2. {
  3. public:
  4. CYouhouApp();
  5. int Toto;
  6. char buf[200];
  7. int getToto();
  8. void setToto(int hp);
  9. ...
  10. };
  11. class CChildView : public CWnd
  12. {
  13. // Construction
  14. public:
  15. CChildView();
  16. ....
  17. };
  18. (dans le .cpp)
  19. BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
  20. {
  21. int rett;
  22. CChildView Kyol;
  23. rett = Kyol.getToto();
  24. ....
  25. }
  26. BOOL CYouhouApp::InitInstance()
  27. {
  28. Toto = 666;
  29. ....
  30. }
  31. int CYouhouApp::getToto()
  32. {
  33. return (Toto);
  34. }


Resultat lors de la compilation :
getToto is not a member of 'CChieldView'
 
 
Snif ...
desole je suis pas au courant de ce qui est objet et ca apparait un peu abstrait pour moi encore pour le moment ! (disons que j en vois pas l interet par rapport a une structure en C !)
Pour l instant ca m embete plus qu autre chose l objet ! :)
Si qqn pouvait m eclaircir ?
 
Merci
 
Xc0r


Message édité par xc0r le 06-12-2002 à 00:07:11
n°262627
linuxine
Posté le 06-12-2002 à 00:22:06  profilanswer
 

il faut que tu déclares le prototype de getToto dans le .h de ta classe


---------------
linuxine, amoureuse des belges et des alsaciens [:utf-8]
mood
Publicité
Posté le 06-12-2002 à 00:22:06  profilanswer
 

n°262628
xc0r
Posté le 06-12-2002 à 00:22:07  profilanswer
 

Bon apres un peu de reflexion, je me rend compte que je dois pas initialiser CChildView Kyol; mais CyouhouApp Kyol; en fait ...
Ben la ca compile mais apres , j ai un debug assetion failed lors de l execution dans le appcore.cpp ....
j avance ou meme pas ?

n°262629
xc0r
Posté le 06-12-2002 à 00:24:41  profilanswer
 

linuxine : de quelle classe ?
CChieldView ou CYouyouApp ?

n°262630
linuxine
Posté le 06-12-2002 à 00:25:20  profilanswer
 

Xc0r a écrit :

linuxine : de quelle classe ?
CChieldView ou CYouyouApp ?


Citation :

Resultat lors de la compilation :
getToto is not a member of 'CChieldView'


à ton avis ?  :sarcastic:


---------------
linuxine, amoureuse des belges et des alsaciens [:utf-8]
n°262635
xc0r
Posté le 06-12-2002 à 00:30:20  profilanswer
 

Oui mais je comprend pas la logique ...
comme si je declare un int getToto(); dans le CChieldView, il va aller chercher le Toto de CYouhouApp ?
 
desespere la .....
 

n°262658
xc0r
Posté le 06-12-2002 à 00:50:58  profilanswer
 

Youhou error LNK2019: unresolved external symbol "public: int __thiscall CChildView::getToto(void)" (?getToto@CChildView@@QAEHXZ) referenced in function "protected: virtual int __thiscall CChildView::PreCreateWindow(struct tagCREATESTRUCTA &)" (?PreCreateWindow@CChildView@@MAEHAAUtagCREATESTRUCTA@@@Z)
 
 
 
pfiou ......

n°262702
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 06-12-2002 à 08:19:48  profilanswer
 

et si tu fopurnis les methodes ?etToto c bien pour que toto ne soit pas public
 
et c'est quoi ces BOOL?


---------------
du bon usage de rand [C] / [C++]
n°262719
xc0r
Posté le 06-12-2002 à 09:02:00  profilanswer
 

Bah les BOOL cest Visual Studio qui  les cree ...
ET cette histoire de public,privee pour l instant je m en occupe pas encore (oui oui je sais "pq faire de l objet" dans ce cas ? ben parce que j y suis oblige :) )
Je me pencherais sur ce pb d'objet plus tard :)
En fait j ai trop ete habitue en C a me faire une structure que je mettais en globale dans laquelle j'avais toutes les informations necessaires ....
la du coup je suis un peu perdu .... :)
 
Ce que je veux c est juste connaitre la valeur de mon Toto de ma class A lorsque je suis dans une fonction de la class B.
J ai pense a class B : public A
 
mais il y a des conflits avec une autre classe cree par Visual studio. (puisque en fait ca me fait ca
class B : public wnd, public A
 
 
Merci en tout cas
 
je crois que je vais tout initialiser dans ma cchieldview comme ca pas de pb...
merci :)
 
Xc0r

n°262769
Acidman
no comment
Posté le 06-12-2002 à 10:32:52  profilanswer
 

attend si je comprend bien tu veut utiliser les methode d'une classe dans une autres?
si c ca je vois pas vraiment de probleme.

n°262812
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-12-2002 à 11:14:43  profilanswer
 

acidman a écrit :

attend si je comprend bien tu veut utiliser les methode d'une classe dans une autres?
si c ca je vois pas vraiment de probleme.
 


Non, il veut récupérer une variable d'une classe dans une autre.
A partir de là, 2 solutions :
 
- Soit il fait une classe amie : totalement absurde et anti-objet comme je le dis plus haut,
- Soit il écrit des méthodes get/set pour manipuler cette variable (lecture et écriture d'attributs)
 
XcOr > je ne vois vraiment pas où tu coinces, c'est vraiment pas sorcier !!
Voici un code exemple, avec le .h correspondant :

Code :
  1. //CChildView.h
  2. class CChildView : public CWnd
  3. {
  4.    // variables membres
  5.    private:
  6.    int toto;
  7.    (...)
  8.    // méthodes
  9.    public:
  10.    void CChildView();
  11.    ~CChildView();
  12.    int getToto(); // pour récupérer la valeur de toto
  13.    void setToto(int); // pour définir la valeur de toto
  14. };


Code :
  1. //CChildView.cpp
  2. #include "CChildView.h"
  3. (... méthodes...)
  4. int CChildView::getToto()
  5. {
  6.    return toto;
  7. }
  8. void CChildView::setToto(int value)
  9. {
  10.    toto = value;
  11. }


Code :
  1. //MonProg.cpp
  2. #include "CChildView.h"
  3. void main()
  4. {
  5.    CChildView *cv;
  6.    int var;
  7.  
  8.    cv = new CChildView();
  9.    var = cv->getToto(); // récupère la valeur de toto dans var
  10.    cv->setToto(4); // toto de CChildView vaut maintenant 4
  11.  
  12.    delete cv;
  13. }


Ou est donc la difficulté ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°262841
Fullblaste​r
Posté le 06-12-2002 à 11:45:59  profilanswer
 

Xc0r a écrit :

Heu j ai fait une betise la ?
(.h)

Code :
  1. class CYouhouApp : public CWinApp
  2. {
  3. public:
  4. CYouhouApp();
  5. int getToto();
  6. void setToto(int hp);
  7. private:
  8. int Toto; // c quand mm plus propre de mettre tes var en protected ou private
  9. char buf[200];
  10. ...
  11. };
  12. class CChildView : public CWnd
  13. {
  14. // Construction
  15. public:
  16. CChildView();
  17. ....
  18. };
  19. (dans le .cpp)
  20. BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
  21. {
  22. int rett;
  23. CYouhouApp Kyol; // c est peut etre la bonne classe la difficulte ;)
  24. rett = Kyol.getToto();
  25. ....
  26. }
  27. BOOL CYouhouApp::InitInstance()
  28. {
  29. Toto = 666;
  30. ....
  31. }
  32. int CYouhouApp::getToto()
  33. {
  34. return (Toto);
  35. }




 
Cependant concenrnant l'endroit ou tu fais tes init soit sur que le preCreateWindows de CWnd s'execute apres InitInstance du CWinApp (enfin la c'est le cas mais c'est pas une generalite)
 
Sinon cf Harkonen pour l'acces aux classes.
 
 
Edit : oups pas fini les phrases la  
 
un truc quand mm ca marchera pas de tt facon le faite de declarer un objet de type tonApp ds ta vue simplement car tu cre une instance de App mais jamais tu ne fait appel a tt les methodes pour l'instancier (et donc tui passe pas ds InitInstance), et si tu essayes de le faire il te jeteras car c est 1 objet CWinApp c tout pas 2.
D'ou les remarques qui suivent.


Message édité par Fullblaster le 06-12-2002 à 12:07:12
n°262861
Fullblaste​r
Posté le 06-12-2002 à 11:59:46  profilanswer
 


Tout projet SDI ou MDI sous VC y a un truc qui s'appel

Code :
  1. CWinApp theApp; //ou le nom de ta mainApp


 
C'est global et c'est la seule instance de l'app ... ca sert pour passer des param au cas ou
 

Code :
  1. BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
  2. {
  3.   int rett;
  4.   rett = theApp.getToto();
  5.   ou
  6.   rett = theApp.toto; // si c public
  7.   ....
  8. }


 
La solution d'acces direct etant crade (cf les raison indiquees).


Message édité par Fullblaster le 06-12-2002 à 12:07:40
n°262971
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 06-12-2002 à 12:51:14  profilanswer
 

genre le type bool est standard, pas BOOl


---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Visual C++ MFC] Faire correspondre deux classes ?

 

Sujets relatifs
[MFC] pb SetDlgItemText()Y'a t-il des personnes qui utilisent Visual Adélia ici ???
Connection aux bases de donnees (ADO, DAO) en Visual Basic.Connaissances concernant le fonctionnement des Sockets en Visual Basic
[MFC] Problème d'includeenvoi d'email simple avec MFC?
Pb d'utilisation des classes enveloppes + algo de triVisual Basic
éditeur qui debug pas à pas à la visual C++[C - Visual Studio] Detection de fuite mémoire
Plus de sujets relatifs à : [Visual C++ MFC] Faire correspondre deux classes ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR