Ho bisogno di aiuto con il compilatore Visual c++ 2008 Express edition...

martedì 25 novembre 2008 - 23.17

rossoclibi Profilo | Newbie

Salve, mi chiamo Rossano. Sono alle primissime armi con il visual c.
Ho creato un progetto win32 di nome "prova" (l'ambiente integrato ha generato in automatico i vari files, come prova.cpp, prova.h e di risorse varie) che, compilati, danno un esecutivo che apre una finestra vuota.
In seguito ho aggiunto al progetto una classe dal nome "cube" con la procedura guidata e sono stati aggiunti i due files "cube.h" e "cube.cpp". Ho scritto qualche funzione membro su questa classe e ho compilato di nuovo. Tutto ok.

di seguito lo scheletro del file cube.h

cube{
//variabili
public:
void drawcube(void);
//altre funzioni membro pubbliche e private
}CUBO;

Se però da "prova.cpp" richiamo una funzione membro che si trova in cube.cpp mi ritrovo con un errore di compilazione, cioè alla riga di codice

CUBO.drawcube();

che si trova in "prova.cpp" il compilatore mi tira fuori questo errore

error C2065: 'CUBO': identificatore non dichiarato
error C2228: l'elemento a sinistra di '.drawcube' deve avere una classe, struttura o unione

CUBO esiste invece, è incluso nel progetto e definito nel file cube.h
Ho provato ad inserire la riga include "cube.cpp" nel file prova.cpp ma il linker mi ha detto che ci sono definizioni doppie. Ho fatto le più disparate prove, ho infilato un pò ovunque la direttiva extern ma niente da fare.

SE ESCLUDO DAL PROGETTO cube.cpp e cube.h e uso include "cube.cpp" sull'intestazione di prova.cpp MI FUNZIONA TUTTO ALLA GRANDE. Compilazione e linking senza errori. In esecuzione le varie funzioni membro richiamate da prova.cpp fanno il loro lavoro.

Il fatto è che con la classe esclusa dal progetto ogni volta che la modifico non posso ricompilarla.
Cioè ad ogni modifica della classe devo reincluderla, compilarla per creare il .obj, riescluderla e ricompilare prova.

E' ridicolo, devo fare in modo che cube.cpp inclusa nel progetto sia ' visibile ' dal file principale ma per quanto banale debba essere io non ci riesco.
Potete aiutarmi?

(Se ho omesso informazioni importanti, chiedetemi pure....)

Grazie sin da ora, RoS

aiedail92 Profilo | Expert

Ciao

Come hai detto tu, CUBO lo definisci nel file cube.h, quindi per poterlo usare altrove dovrai includere cube.h, non cube.cpp (e comunque i file .h dovrebbero contenere solo le dichiarazioni e i .cpp le definizioni, pertanto bisognerebbe includre sempre e solo file .h)

In questo modo comunque otterresti definizioni doppie della variabile CUBE: infatti verrebbe ridefinita ogni volta che includi l'header (ecco perchè i .h dovrebbero contenere solo le dichiarazioni)

Adesso, per riolvere hai due opportunità: se CUBO ti serve solo dal file prova.cpp, puoi definirlo direttamente lì invece che in cube.h; altrimenti per poterlo usare ovunque puoi dichiararlo extern e definirlo nel file cube.cpp (che non devi includere, è un .cpp ), in questo modo:

//cube.h: class cube { public: void drawcube(); }; extern cube CUBO; //cube.cpp #include "cube.h" void cube::drawcube() { //... } cube CUBO; //prova.cpp #include "cube.h" void test() { CUBO.drawcube(); }

Luca

rossoclibi Profilo | Newbie

Ciao Luca,
moltissime grazie per la risposta. E' andata la primo colpo.

In effetti quello che non avevo capito (e che spero di ricordarmi sempre da ora in avanti) è che tra dichiarazione e definizione c'è una differenza. Nel file .h avevo fatto indiscriminatamente entrambe e quando includevo il file.h il compilatore rilevava la doppia definizione.

Con lo scheletro che mi hai proposto va tutto bene. Di nuovo grazie.

Avrei un milione di altre domande ma preferisco sbatterci la testa ancora qualche giorno, io mi diverto così
Quando proprio sarò esasperato spero di poter ancora attingere dalla tua esperienza.

/*
Dirò una stupidaggine adesso, ma secondo me esercitarsi nella programmazione (di questo o altri linguaggi) aiuta la mente ad acquistare un forte rigore logico che poi, credo, serva anche in diverse occasioni della vita.
Un pò come giocare a scacchi solo che davanti al PC la cosa è incredibilmente più stimolante.
*/

Di nuovo grazie

Rossano

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5