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

  FORUM HardWare.fr
  Programmation
  C++

  Variables dans les classes (accéder à une autre classe)

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Variables dans les classes (accéder à une autre classe)

n°722862
choupinou
Posté le 12-05-2004 à 10:44:16  profilanswer
 

:bounce:
Comment faire pour modifier les valeurs des variables d'une classe avec une autre classe?


Message édité par choupinou le 12-05-2004 à 10:45:55
mood
Publicité
Posté le 12-05-2004 à 10:44:16  profilanswer
 

n°722864
kadreg
profil: Utilisateur
Posté le 12-05-2004 à 10:45:27  profilanswer
 

\_o<~coin

n°722891
choupinou
Posté le 12-05-2004 à 11:08:33  profilanswer
 

Exemple :
2 classes
class CxxxxxDoc
class CInterface
 
comment modifier les valeurs de la classe CxxxxxDoc à partir de la classe CInterface?
Si j'utilise, dans une fonction de ma classe CInterface une variable de type:
CxxxxxDoc doc;
et que j'utilise cette variable:
doc.m_xxx;            //m_xxx est membre de CxxxxDoc
le Handle de doc vaut 0 => il n'existe pas!
Comment faire alors?
Je pensai peut-être utiliser un pointeur sur la classe mais comment l'obtenir?
et

n°722894
skeye
Posté le 12-05-2004 à 11:09:45  profilanswer
 


PAN!

n°722944
Ace17
Posté le 12-05-2004 à 11:31:43  profilanswer
 

Tu peux pas modifier les valeurs des variables d'une classe... tu peux modifier les valeurs des membres d'une instance d'une classe...
 

Code :
  1. class Boolay
  2. {
  3. public:
  4.     int m_Iq;
  5. };
  6. class IqTest
  7. {
  8. public:
  9.     Test(Boolay& b)
  10.     {
  11.         b.m_Iq = 0;
  12.     };
  13. };


Message édité par Ace17 le 12-05-2004 à 11:32:33
n°722947
jagstang
Pa Capona ಠ_ಠ
Posté le 12-05-2004 à 11:32:53  profilanswer
 

ames sensibles s'abstenir :

Spoiler :


balance tout en public

n°722953
Ace17
Posté le 12-05-2004 à 11:34:31  profilanswer
 

Et merci a Taz de s'abstenir de toute remarque sur la qualité du code... c'est pas le but (je précise  :lol: )

n°724334
choupinou
Posté le 13-05-2004 à 10:43:13  profilanswer
 

Je vais reformuler ma question :
 
2 classes:
DECLARATIONS

Code :
  1. class Classe1
  2. {
  3.    int m_membre;    //Variable membre
  4. }
  5. class Classe2
  6. {
  7.    void fonction(void);
  8. }


 
EXECUTION 1:

Code :
  1. void fonction(void)
  2. {
  3.    Classe1 classe1;    //Pas de warning mais le handle de classe1
  4.                        //vaut 0 => problème car inexistant
  5.    classe1.m_membre;   //m_membre prend une valeur aléatoire
  6. }


 
EXECUTION 2:

Code :
  1. void fonction(void)
  2. {
  3.    Classe1 *classe1=????    //le pointeur sur la classe doit etre
  4.                             //initialisé mais par quelle valeur?
  5.    classe1->m_membre;       //résultat inconnu puisque pointeur non
  6.                             //initialisé
  7. }


 
Question : Comment obtenir le pointeur sur la classe Classe1?
 

n°724338
jagstang
Pa Capona ಠ_ಠ
Posté le 13-05-2004 à 10:45:35  profilanswer
 

Code :
  1. Classe1 *c1 = new Classe1() ;


 

n°724341
choupinou
Posté le 13-05-2004 à 10:48:42  profilanswer
 

Je vais essayer
merci

mood
Publicité
Posté le 13-05-2004 à 10:48:42  profilanswer
 

n°724411
Taz
bisounours-codeur
Posté le 13-05-2004 à 11:13:42  profilanswer
 

??? jag tu serais pas entrain de nous faire un syndrome java là ?

n°724423
jagstang
Pa Capona ಠ_ಠ
Posté le 13-05-2004 à 11:16:02  profilanswer
 

Taz a écrit :

??? jag tu serais pas entrain de nous faire un syndrome java là ?


oui, je fais une indigestion de Java depuis 3 semaines.. je l'avoue

n°724441
Taz
bisounours-codeur
Posté le 13-05-2004 à 11:25:10  profilanswer
 

non ce que je veux dire, c'est que je vois des gens se plaindre d'objet pas initialisés (ne pas définir de constructeurs ne les gènent pas plus que ça) et après, je vois apparaitre une syntaxe miracle
 

Code :
  1. Classe1 *c1 = new Classe1() ;


 
alors je sais pas si clair
 
 
void fonction(void) est parfaitement inutile

n°724454
jagstang
Pa Capona ಠ_ಠ
Posté le 13-05-2004 à 11:29:35  profilanswer
 

je vois oui
 
edit : j'ai lu le topic un peu vite je dois dire


Message édité par jagstang le 13-05-2004 à 11:30:53
n°724484
Ace17
Posté le 13-05-2004 à 11:43:26  profilanswer
 

Choupinou a écrit :


Code :
  1. void fonction(void)
  2. {
  3.    Classe1 *classe1=????    //le pointeur sur la classe doit etre
  4.                             //initialisé mais par quelle valeur?
  5.    classe1->m_membre;       //résultat inconnu puisque pointeur non
  6.                             //initialisé
  7. }


 
Question : Comment obtenir le pointeur sur la classe Classe1?


 
Ton objet de type classe1, il est créé par qui? Et quelle est sa portée?
 
Et c'est quoi que tu appelles le "handle" de la classe1?

n°724807
choupinou
Posté le 13-05-2004 à 15:23:18  profilanswer
 

Ca marche pas!!!
Quande je fais

Code :
  1. Classe1 *c1 = new Classe1() ;


le compilateur l'accepte mais au débogueur, il me dit que
c1        0x0032f... {Classe1 hwnd=0x0000000 {Unused=???}}
=> c'est ce que je disais : c'est comme si la classe n'existait pas!

n°724809
Joel F
Real men use unique_ptr
Posté le 13-05-2004 à 15:26:14  profilanswer
 

Classe1* c1 = new Classe1;  
 
ca suffit ....


Message édité par Joel F le 13-05-2004 à 17:41:43
n°724811
choupinou
Posté le 13-05-2004 à 15:27:32  profilanswer
 

En fait ca c'est pour créer un nouvel objet?
Moi ce que je veux c'est pouvoir utiliser un objet déjà existant

n°724869
jagstang
Pa Capona ಠ_ಠ
Posté le 13-05-2004 à 16:16:13  profilanswer
 

tu confonds instance d'objet et classe. Désolé de pas avoir corrigé mon post

n°724911
choupinou
Posté le 13-05-2004 à 16:58:50  profilanswer
 

CA MARCHE PAS!!!

n°724935
marmotte.t​ranquille
Posté le 13-05-2004 à 17:31:29  profilanswer
 

Choupinou a écrit :

CA MARCHE PAS!!!


 
Faut pas s'énerver, ça ne donne pas envie de t'aider...
 
Ta Classe1 est définie, mais en as-tu créé une instance ?

n°725242
Ace17
Posté le 13-05-2004 à 21:44:41  profilanswer
 

marmotte.tranquille a écrit :

Faut pas s'énerver, ça ne donne pas envie de t'aider...
 
Ta Classe1 est définie, mais en as-tu créé une instance ?


 
Mais c'est justement ca son probleme! Il ne fait pas la différence entre une classe et une instance de cette classe...

n°725614
choupinou
Posté le 14-05-2004 à 10:43:43  profilanswer
 

Désolé je ne m'énerve pas mais c'est juste que je comprend pas pourquoi ca marche pas.
Vous me dites que je ne fais pas la différence entre classe et instance de classe. C'est quoi la diff alors?

n°725617
skeye
Posté le 14-05-2004 à 10:46:18  profilanswer
 

Choupinou a écrit :

Désolé je ne m'énerve pas mais c'est juste que je comprend pas pourquoi ca marche pas.
Vous me dites que je ne fais pas la différence entre classe et instance de classe. C'est quoi la diff alors?


Une classe c'est la définition d'une type d'objet.
Une instance de la classe c'est un objet de ce type.

n°725618
jagstang
Pa Capona ಠ_ಠ
Posté le 14-05-2004 à 10:46:21  profilanswer
 

une classe est un patron, un modèle. (p.ex : chat)
une instance est une entité existante (minou, babouche, grisouille)
 
je te conseille fortement d'apprendre les bases de la programmation orienté objet avant de continuer...

n°725621
skeye
Posté le 14-05-2004 à 10:47:10  profilanswer
 

JagStang a écrit :


je te conseille fortement d'apprendre les bases de la programmation orienté objet avant de continuer...


[:benou_+1]
Sans ça tu n'arriveras à rien de bon.

n°725627
choupinou
Posté le 14-05-2004 à 10:48:58  profilanswer
 

Oui d'accord je savais déjà ca mais ca ne résoud pas mon problème

n°725630
skeye
Posté le 14-05-2004 à 10:50:12  profilanswer
 

Choupinou a écrit :

Oui d'accord je savais déjà ca mais ca ne résoud pas mon problème


 
Au risque d'insister lourdement :

JagStang a écrit :


je te conseille fortement d'apprendre les bases de la programmation orienté objet avant de continuer...


 
[edit]
http://casteyde.christian.free.fr/ [...] book1.html


Message édité par skeye le 14-05-2004 à 10:52:08
n°725841
Ace17
Posté le 14-05-2004 à 12:10:32  profilanswer
 

Eh bien c'est simple : ton probleme c'est que tu veux accéder a un membre d'une classe alors que tu n'en as aucune instance.
C'est comme si je disais :
Une glace, c'est a quel parfum?
Parce qu'une glace n'est rien d'autre qu'une abstraction de l'objet que j'ai dans la main et que je m'apprete a manger, et qui est a la fraise.  
 
class glace
{
   parfum
}
 
glace ma_glace;
glace ta_glace;
 
ma_glace.parfum = FRAISE
ta_glace.parfum = CANNELLE

n°727856
choupinou
Posté le 17-05-2004 à 08:55:57  profilanswer
 

Oui c'est justement ca le problème:je n'arrive pas à créer une instance de classe valide. J'ai peut-être oublié de dire que je travaille avec les MFC (projet multidocuments) et que les classes concernées sont utilisées en tant que CRunTimeClass (chacune est une partie du document -> l'une est CDoc et l'autre est CForView).
Parce que il est très simple de créer une boite de dialogue par exemple, de créer une nouvelle classe pour cette boite de dialogue (qui peut s'appeler glace) et de modifier les variables tel que Ace17 l'a écrit. C'est ce que j'utilise tout le temps pour mes boites de dialogues ou autres classes.
Mais j'avais déjà remarqué que je ne pouvais pas aller dans l'autre sens.
Comme je l'ai déjà expliqué si je fais:

Code :
  1. class glace
  2. {
  3.    parfum;
  4. }


et que je créé une instance de classe (à partir de mon autre classe):

Code :
  1. glace ma_glace;
  2. ma_glace.parfum=FRAISE;


Au débogueur, je m'apercois que pour la ligne

Code :
  1. glace ma_glace;


ma_glace : hwnd=0x000000      <- c'est ici le problème car pourquoi ici il vaut 0 alors que pour mes boites de dialogue il a bien une valeur correcte?
(0 <=> aucune classe de ce type existante)

n°727978
Ace17
Posté le 17-05-2004 à 10:26:45  profilanswer
 

Bon ben déja si tu fais :

Code :
  1. glace ma_glace

Ton objet est bien créé. Et ses variables membres aussi. Ca répond donc a ta question initiale, a savoir l'acces aux membres.
 
Mettons les choses au point : Le handle d'une classe, ca ne veut rien dire. Un handle, c'est une variable qui te permet d'identifier et de suivre un objet créé par windows, le plus souvent une fenetre ou un controle.
 
Si ta classe créée une fenetre, il est probable qu'elle dispose d'un membre qui serve de handle pour identifier cette fenetre. Mais si cette fenetre n'a pas été créée, c'est normal que le membre hwnd soit a zero.  
 
N'y aurait-il pas une fonction d'initialisation dans CxxxDoc que tu aurais oublié d'appeler?

n°728008
choupinou
Posté le 17-05-2004 à 10:40:24  profilanswer
 

En fait CxxxDoc est déjà créé grace aux MFC. En fait dans ma création de projet j'ai sélectionné l'option "prise en charge de l'architecture Document/View" et j'ai ensuite remplacé la classe CView par ma classe de type CFormView.
Donc pour répondre à ta question CxxxDoc est bien initialisée mais pas par moi. Comme je l'ai dit le problème serait peut-être du alors au fait que mes 2 classes fassent partie d'un projet multidoc.

n°728078
Ace17
Posté le 17-05-2004 à 11:11:35  profilanswer
 

Choupinou a écrit :

En fait CxxxDoc est déjà créé grace aux MFC


 
Tu as dit que tu faisais :
CxxxxxDoc doc;
doc.m_xxx;
 
Donc c'est pas MFC qui crée doc, c'est toi!

n°728087
Ace17
Posté le 17-05-2004 à 11:13:59  profilanswer
 

Choupinou a écrit :

En fait CxxxDoc est déjà créé grace aux MFC


 
Ca n'a pas de sens d'initialiser une classe. On initialise une instance de cette classe. Les MFC, avec leurs DECLARE_DYNCREATE masquent cette différence, mais faut que tu te dises que si tu créées toi meme un objet de type CxxxDoc il faudra l'initialiser aussi.

n°728110
choupinou
Posté le 17-05-2004 à 11:23:48  profilanswer
 

Et comment je fais pour l'initialiser?
Au fait c'est évident qu'on ne peut initialiser une classe c'était juste une facon de parler

n°730175
choupinou
Posté le 18-05-2004 à 13:06:28  profilanswer
 

Je vais essayer de reprendre clairement ce qui se passe même si je ne comprend pas pourquoi.
 
Imaginons que j'ai un projet comportant la fenêtre principale, la fenêtre enfant et une boite de dialogue. Jusque là tout va bien.
Voici un exemple de ces classes :
 
class CMainFrame //Classe de la fenêtre principale
{
CMainFrame();
~CMainFrame();
 
public:
void Appel_Dialog(void);
}
 
class CMaBoiteDeDlg //Classe de la boite de dialogue
{
CMaBoiteDeDlg();
~CMaBoiteDeDlg();
 
public:
CString m_Dialog_txt;
}
 
class CInterface //Classe de la fenêtre enfant
{
CInterface();
~CInterface();
public:
CString m_txt;
}
 
 
Maintenat je créé une exécution :
 
void CMainFrame::Appel_Dialog(void)
{
CMaBoiteDeDlg dlg;
 
dlg.m_Dialog_txt="Salut";
 
dlg.DoModal();
 
CInterface Interface;
 
Interface.m_txt="Au revoir";
}
 
void CMaBoiteDeDlg::Affiche_Msg()
{
AfxMessageBox(m_Dialog_txt); //Affiche bien "Salut"
}
 
 
Donc là ça marche comme je le souhaite
Par contre si je fais (avec le même code que precedemment):
 
void CInterface::Affiche_MSG()
{
AfxMessageBox(m_txt); //PB ici -> Affiche ""! m_txt=NULL
}
 
 
Je comprend pas pourquoi ça ne marche pas comme pour une boite de dialogue?
 

n°730338
Ace17
Posté le 18-05-2004 à 14:46:51  profilanswer
 

Dans l'ordre, tu les fais comment tes appels?
Et pourrais tu me montrer le code du constructeur de CMaBoiteDeDlg?
 

Code :
  1. void CMainFrame::Appel_Dialog(void)
  2. {
  3. CMaBoiteDeDlg dlg;
  4. dlg.m_Dialog_txt="Salut";
  5. dlg.DoModal();
  6. CInterface Interface;
  7. Interface.m_txt="Au revoir";
  8. // je te rappelle qu'a cet instant, l'objet de type CInterface que tu as créé localement et que tu as nommé Interface est sur le point d'etre détruit...  
  9. }


Message édité par Ace17 le 18-05-2004 à 14:50:14
n°730340
Ace17
Posté le 18-05-2004 à 14:47:28  profilanswer
 

Et puis fous moi ce code entre balises!

n°730342
choupinou
Posté le 18-05-2004 à 14:52:59  profilanswer
 

Bah je ferais d'abord appel à CMainFrame::Appel_Dialog() pour affecter la valeur "Salut" à dlg.m_Dialog_txt et pour afficher une boite de dlg.
Ensuite, ma boite de dialogue afficherait la valeur de m_Dialog_txt grâce à la fonction CMaBoiteDeDialog::Affiche_Msg();
Enfin, le programme retournerait dans CMainFrame::Appel_Dialog(); pour affecter la valeur "Au revoir" à Interface.m_txt; (jusqu'ici tout marche bien!)
Maintenant, CInterface::Affiche_MSG(); est appelée et là soit foire!

n°730353
Ace17
Posté le 18-05-2004 à 15:04:00  profilanswer
 

Les balises stp....
 
Et sinon, je te rappelle que quand tu fais :

Code :
  1. CInterface Interface;
  2. Interface.m_txt="Au revoir";


tu créées un nouvel objet de type CInterface, ton objet se nomme "Interface", et il sera DETRUIT quand tu sortiras de Appel_Dialog. Tu comprends?
Je ne sais pas quel objet tu utilises pour appeler Affiche_MSG mais c'est pas le meme!

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  Variables dans les classes (accéder à une autre classe)

 

Sujets relatifs
Accéder à une base Access à partir de Linux[CGI]comment récupère t on les variables de la query string
Variables globales borland c++ builderIndirection pour des noms de variables
[Fixed!][HTML] (Form) 'action' avec variables en GET ? (Pb)Probleme d'utilisation des variables je crois (PHP + SVG)
Acceder a une page avec un prog java sans passer par la page d'accesPartage de classes statiques entre web-apps
[PHP]Problème avec les variables de session 
Plus de sujets relatifs à : Variables dans les classes (accéder à une autre classe)


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