Newsgroup: it.comp.lang.c++
Titolo: Domanda forse stupida e scontata, ma...

Ho creato un progetto Dialog-based Application con Visual C++ (l'ho chiamato
Prova). Mi ha creato le classi CAboutDlg, CProvaApp, CProvaDlg e i file:
Prova.cpp, ProvaDlg.cpp,
StdAfx.cpp, Prova.h, ProvaDlg.h, StdAfx.h.
La mia domanda è questa: se avessi bisogno di una struttura dati visibile
globalmente (nel mio caso un oggetto CStringArray), dove dovrei dichiararla
e dove iniziarizzarla. Se la metto in Prova.h, risulta visible dappertutto
(la compilazione va bene), ma nel linking di ProvaDlg.obj mi dice che tale
variabile è già definita in Prova.obj. Come si risolve questa cosa? E se la
mettessi come attributo della classe CProvaApp, come faccio ad indirizzarmi
ad esso dal codice, per esempio, della classe CProvaDlg? So che forse è una
domanda stupida e scontata, però ...
Grazie a chiunque vorrà rispondermi.
N.B. rimuovere KKK per rispondere

 domanda stupida e scontata, però ...
Se hai una variabile che deve essere utiulizzata da piu' moduli devi
dichiararla in uno di essi (es. a.cpp), non in un header (che e'
sbagliato), e nell'altro modulo (es. b.cpp) devi indicare che la
variabile e' esterna con la sistassi:
extern tipo identificatore
Spero di essere stato di aiuto.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

ad esso dal codice, per esempio, della classe CProvaDlg? So che forse è
Nel tuo header file prova.h dovrebbe esserci al
dichiarazione dell'oggetto globale theApp, unico e
solo oggetto di un tipo derivato da CWinApp.  Quindi,
se la classe CProvaApp ha una variabile chiamata
pippo, da qualsiasi punto del programma dovresti
potervi accedere come theApp.pippo (sempre che
la variabile sia pubblica, naturalmente).  Verifica lo
spelling... non ho in questo momento la possibilita`
di controllarlo!
(Ah, a proposito: la _definizione_ di theApp, come
vedrai, e` naturalmente in prova.cpp).
Alex

Ti ringrazio molto per la delucidazione. Solo che non mi funziona per le
classi. Nel senso che ho aggiunto una classe con ClassWizard, e lui ha
creato i relativi file .h e .cpp. Quando torno in Prova.h e modifico la riga
CBitmapButton m_button
con
CMyButton m_button
mi da il seguente messaggio d'errore:
c:\Prova\ProvaDlg.h(25) : error C2501: 'CMyButton' : missing decl-specifiers
Aggiungo la riga
class CMyButton : CBitmapButton {} extern;
in Prova.h e mi da il seguente messaggio d'errore
c:\Prova\MyButton.h(13) : error C2011: 'CMyButton' : 'class' type
redefinition
(CMyButton č la classe aggiunta, derivata dalla CBitmapButton. Mi serve per
modificare il comportamento standard di un owner draw button).
In questo caso dove sbaglio? Come funziona per le classi?
La soluzione che ho trovato io č questa: quando creo la classe CMyButton,
gli dico di utilizzare come header file Prova.h piuttosto che creare
MyButton.h. Poi sposto la dichiarazione (giusto?) della classe CMyButton
prima di quella di CProvaDlg e tutto funziona. E' cosě che si fa?



prima di quella di CProvaDlg e tutto funziona. E' cosě che si fa?
No, normalmente una classe X si dichiara in X.h; basta che X.h sia
incluso in ogni altro header Y.h che usa X, e ogni header file si
protegga contro inclusioni multiple (con #pragma once, o con il
normale idioma ifndef/define/endif).
Alex

dichiararla, es "class CMyButton;", ma non e` questo il tuo caso).
Ancora una volta ti ringrazio per tutto l'aiuto che mi stai dando.

...
    [snip]

Prego! Qui, tu la classe CProvaDlg non "la nomini solo", bensi`
la usi (chiami uno dei suoi metodi), quindi deve essere nota, non
basta la "forward declaration" che hai aggiunto.  NON editare
ulteriormente i file di header, ma aggiungi lo:
#include "ProvaDlg.h"
nel file di _implementazione_ di CMyButton, cioe` MyButton.cpp.
Alex
// righe aggiunte per i dannati server che non accettano "piu`
// testo citato che risposta", visto che qui valuto che il testo
// che ho citato devo citarlo tutto, e, se la mia risposta risulta
// piu` breve della domanda, che ci posso fare...?
// righe aggiunte per i dannati server che non accettano "piu`
// testo citato che risposta", visto che qui valuto che il testo
// che ho citato devo citarlo tutto, e, se la mia risposta risulta
// piu` breve della domanda, che ci posso fare...?
// righe aggiunte per i dannati server che non accettano "piu`
// testo citato che risposta", visto che qui valuto che il testo
// che ho citato devo citarlo tutto, e, se la mia risposta risulta
// piu` breve della domanda, che ci posso fare...?
// righe aggiunte per i dannati server che non accettano "piu`
// testo citato che risposta", visto che qui valuto che il testo
// che ho citato devo citarlo tutto, e, se la mia risposta risulta
// piu` breve della domanda, che ci posso fare...?