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

Variables dans les classes (accéder à une autre classe) - C++ - Programmation

Marsh Posté le 12-05-2004 à 10:44:16    

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

Marsh Posté le 12-05-2004 à 10:44:16   

Reply

Marsh Posté le 12-05-2004 à 10:45:27    

\_o<~coin

Reply

Marsh Posté le 12-05-2004 à 11:08:33    

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

Reply

Marsh Posté le 12-05-2004 à 11:09:45    


PAN!

Reply

Marsh Posté le 12-05-2004 à 11:31:43    

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
Reply

Marsh Posté le 12-05-2004 à 11:32:53    

ames sensibles s'abstenir :

Spoiler :


balance tout en public

Reply

Marsh Posté le 12-05-2004 à 11:34:31    

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

Reply

Marsh Posté le 13-05-2004 à 10:43:13    

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?
 

Reply

Marsh Posté le 13-05-2004 à 10:45:35    

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


 

Reply

Marsh Posté le 13-05-2004 à 10:48:42    

Je vais essayer
merci

Reply

Marsh Posté le 13-05-2004 à 10:48:42   

Reply

Marsh Posté le 13-05-2004 à 11:13:42    

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

Reply

Marsh Posté le 13-05-2004 à 11:16:02    

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

Reply

Marsh Posté le 13-05-2004 à 11:25:10    

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

Reply

Marsh Posté le 13-05-2004 à 11:29:35    

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
Reply

Marsh Posté le 13-05-2004 à 11:43:26    

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?

Reply

Marsh Posté le 13-05-2004 à 15:23:18    

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!

Reply

Marsh Posté le 13-05-2004 à 15:26:14    

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


Message édité par Joel F le 13-05-2004 à 17:41:43
Reply

Marsh Posté le 13-05-2004 à 15:27:32    

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

Reply

Marsh Posté le 13-05-2004 à 16:16:13    

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

Reply

Marsh Posté le 13-05-2004 à 16:58:50    

CA MARCHE PAS!!!

Reply

Marsh Posté le 13-05-2004 à 17:31:29    

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 ?

Reply

Marsh Posté le 13-05-2004 à 21:44:41    

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

Reply

Marsh Posté le 14-05-2004 à 10:43:43    

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?

Reply

Marsh Posté le 14-05-2004 à 10:46:18    

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.

Reply

Marsh Posté le 14-05-2004 à 10:46:21    

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

Reply

Marsh Posté le 14-05-2004 à 10:47:10    

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.

Reply

Marsh Posté le 14-05-2004 à 10:48:58    

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

Reply

Marsh Posté le 14-05-2004 à 10:50:12    

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
Reply

Marsh Posté le 14-05-2004 à 12:10:32    

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

Reply

Marsh Posté le 17-05-2004 à 08:55:57    

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)

Reply

Marsh Posté le 17-05-2004 à 10:26:45    

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?

Reply

Marsh Posté le 17-05-2004 à 10:40:24    

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.

Reply

Marsh Posté le 17-05-2004 à 11:11:35    

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!

Reply

Marsh Posté le 17-05-2004 à 11:13:59    

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.

Reply

Marsh Posté le 17-05-2004 à 11:23:48    

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

Reply

Marsh Posté le 18-05-2004 à 13:06:28    

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?
 

Reply

Marsh Posté le 18-05-2004 à 14:46:51    

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
Reply

Marsh Posté le 18-05-2004 à 14:47:28    

Et puis fous moi ce code entre balises!

Reply

Marsh Posté le 18-05-2004 à 14:52:59    

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!

Reply

Marsh Posté le 18-05-2004 à 15:04:00    

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!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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