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

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

Marsh Posté le 05-12-2002 à 20:40:19    

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 :)

Reply

Marsh Posté le 05-12-2002 à 20:40:19   

Reply

Marsh Posté le 05-12-2002 à 21:08:49    

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++]
Reply

Marsh Posté le 05-12-2002 à 21:12:13    

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)
Reply

Marsh Posté le 05-12-2002 à 21:14:05    

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++]
Reply

Marsh Posté le 05-12-2002 à 21:17:00    

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

Reply

Marsh Posté le 05-12-2002 à 21:19:34    

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++]
Reply

Marsh Posté le 05-12-2002 à 22:49:55    

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

Reply

Marsh Posté le 05-12-2002 à 23:02:05    

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

Reply

Marsh Posté le 06-12-2002 à 00:05:12    

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
Reply

Marsh Posté le 06-12-2002 à 00:22:06    

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]
Reply

Marsh Posté le 06-12-2002 à 00:22:06   

Reply

Marsh Posté le 06-12-2002 à 00:22:07    

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 ?

Reply

Marsh Posté le 06-12-2002 à 00:24:41    

linuxine : de quelle classe ?
CChieldView ou CYouyouApp ?

Reply

Marsh Posté le 06-12-2002 à 00:25:20    

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]
Reply

Marsh Posté le 06-12-2002 à 00:30:20    

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 .....
 

Reply

Marsh Posté le 06-12-2002 à 00:50:58    

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 ......

Reply

Marsh Posté le 06-12-2002 à 08:19:48    

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++]
Reply

Marsh Posté le 06-12-2002 à 09:02:00    

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

Reply

Marsh Posté le 06-12-2002 à 10:32:52    

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.

Reply

Marsh Posté le 06-12-2002 à 11:14:43    

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)
Reply

Marsh Posté le 06-12-2002 à 11:45:59    

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
Reply

Marsh Posté le 06-12-2002 à 11:59:46    


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
Reply

Marsh Posté le 06-12-2002 à 12:51:14    

genre le type bool est standard, pas BOOl


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed