Faire correspondre deux classes ? [Visual C++ MFC] - C++ - Programmation
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
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...
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
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
Marsh Posté le 05-12-2002 à 21:19:34
fais ceci: muni ta classe ChildView de 2 methodes:
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
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
Marsh Posté le 06-12-2002 à 00:05:12
Heu j ai fait une betise la ?
(.h)
Code :
|
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
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
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 ?
Marsh Posté le 06-12-2002 à 00:24:41
linuxine : de quelle classe ?
CChieldView ou CYouyouApp ?
Marsh Posté le 06-12-2002 à 00:25:20
Xc0r a écrit : linuxine : de quelle classe ? |
Citation : Resultat lors de la compilation : |
à ton avis ?
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 .....
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 ......
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
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.
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? |
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 :
|
Code :
|
Code :
|
Ou est donc la difficulté ?
Marsh Posté le 06-12-2002 à 11:45:59
Xc0r a écrit : Heu j ai fait une betise la ?
|
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.
Marsh Posté le 06-12-2002 à 11:59:46
Tout projet SDI ou MDI sous VC y a un truc qui s'appel
Code :
|
C'est global et c'est la seule instance de l'app ... ca sert pour passer des param au cas ou
Code :
|
La solution d'acces direct etant crade (cf les raison indiquees).
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