Newsgroup: it.comp.programmare.win32
Titolo: Passaggio parametri da una classe all'altra

Ciao a tutti,
ho il seguent problema e ci stò sbattendo la testa da tempo.
Ho due classi CClasseA e CClasseB (due dialog class), la seconda deve
passare
dei dati alla prima (nella seconda scrivo in un'edit box qualche cosa che
deve essere
noto anche alla seconda).
#include "ClasseA.h"
class CClasseB : public CDialog
{
public:
 CClasseB(CWnd* pParent = NULL);   // standard constructor
 CClasseA* m_pParent;
 };
Mi aspettavo di poter usare il puntatore m_pParent dalla mia seconda classe
per lavorare
sulla prima una volta correttamente inizializzato, ma non è così.
Il compilatore mi da sulla linea in cui definisco il mio puntatore tre
errori:
error C2143: syntax error : missing ';' before '*'
error C2501: 'CMLaunchDlg' : missing storage-class or type specifiers
error C2501: 'm_pParent' : missing storage-class or type specifiers
Sostituendo CClasseA* con CWnd* tutto funziona ma poi devo ogni volta fare
il subclassing.
Ho trovato questo esempio su un libro (li dice che funziona, a me no).
Evidentemente faccio qualche cosa che non và.
Immagino che il passaggio di parametri sia operazione superdiffusa, spero
che qualcuno
abbai avuto il mio stesso problema e/o sappia come risolverlo.
Grazie a chiunque vorrà rispondermi.

 wrote in message
news:FOCM9.34433$TC5.1...@twister1.libero.it...

Ciao,
mi sembra che dall'esempio che hai postato al compilatore non risulta sia
stata definita la classe CClasseA.
So che includi l'header file  "ClasseA.h" , a questo punto postane il codice
cosi' vediamo come e' stata definita CClasseA.
Gia' che ci siamo diamo un'occhiata a CMLaunchDlg che non risulta in nessun
posto nel tuo esempio ma solo nel messaggio di errore del compilatore.
Ho come il sospetto che tu abbia scritto la classe ClasseA saltando la prima
C.
Maurus

 ha scritto nel messaggio
news:atv2pk$30igu$1...@ID-125555.news.dfncis.de...

Ciao Maurus e grazie per la risposta,
in realtà la classe CMLaunchDlg è il nome reale della classe che avevo
indicato
nel precedente messaggio con CClasseA e cioè la mia dialog principale.
Ho cambiato i nomi per cercare di essere il più esplicito possibile quindi
CClasseA = CMLaunchDlg.
Continuando su questa falsa riga ti riporto il codice con cui AppWizard
definisce tale classeA e dove
come prima elimino i commenti e gli elementi per la gestione dei messaggi.
#include "ClasseB.h" // Added by ClassView
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
////////////////////////////////////////////////////////////////////////////
/
// CClasseA dialog
class CClasseA : public CDialog
{
// Construction
public:
 CClasseB * m_pModeless;
 CClasseA (CWnd* pParent = NULL); // standard constructor
};
Purtroppo non capisco, dovrebbe funzionare tranquillamente eppure niente.
Non cè mica qualche cosa da settare a livello di paramtri di progetto di
VisualStudio,
magari che lavorano sul compilatore o roba del genere?
Giuseppe

 wrote:
mega cut.....
Ragazzi , imparate a quotare.


Bene, ho finalmente capito il tuo problema.
Siccome fai dei riferimenti incrociati fra CClasseA e CClasseB e'
sufficiente che nell'header file dove definisci la CClasseB, appena prima
della definizione, tu faccia una predichiarazione di CClasseA.
Mi spiego meglio col codice:
#ifndef CClasseB_Header
#define CClasseB_Header
#include "ClasseA.h"
class CClasseA; // Aggiungi questa riga qua
class CClasseB : public CDialog
{
public:
 CClasseB(CWnd* pParent = NULL);   // standard constructor
 CClasseA* m_pParent;
 };
#endif
Ora dovrebbe andare.
Maurus


Porca l'oca,
ma comè possibile?!! funziona!!
La mia non è un'esclamazione di sfiducia nei tuoi confronti, anzi Grazie
MILLE
ed a buon rendere (anche se non sò se avrò le capacità per darti una mano).
Rimanendo sull'argomento, perchè la direttiva #include "ClasseA.h" non è
sufficiente per il
corretto funzionamento dell'applicazione?
Grazie ancora Maurus,
ho bisogno di capire.


Porca l'oca!
Il meccanismo si chiama "forward declaration" e serve anche in casi come
questo a far capire al compilatore che la classe e' definita e dichiarata
altrove.
Anche con l'include il problema non viene risolto in quanto la definizione
della classe CClasseA dipendeva dalla definizione della CClasseB che a sua
volta ridipendeva da CClasseA in un bel circolo vizioso.
Per far terminare questo circolo vizioso, serviva appunto una forward
declaration della classe CClasseA, in modo tale da far star tranquillo il
compilatore.
So che mi sono spiegato come un sanbernardo che cerca di parlare di C++, per
cui ti invito a cercare su un buon manuale o su google l'argomento delle
forward declaration per le classi di C++.
Oppure qualche anima pia di questo newsgroup o di it.comp.lang.c++ potra'
spiegarti piu' a fondo il concetto.
Maurus

 ha scritto nel messaggio
news:au24g0$3prd9$1...@ID-125555.news.dfncis.de...
