PDA

View Full Version : [C++] Errore del linker che non riesco a trovare


Dani88
26-03-2008, 11:41
###############################################################
PROBLEMA LINKER RISOLTO (VEDI PIU' GIU' PER IL PROBLEMA SCRITTO NEL TITOLO ) #################################################################

Raga avrei bisogno di aiuto: quando vado a compilare il seguente codice
#include "allegro.h"

// ----------------------------- dichiarazione variabili ------------------------------
BITMAP *buf,*sprite;
PALETTE colori; // in colori andrà inserito il valore della profondità di colore
int w,h;
//--------------------------------------------------------------------------------------

class Video{ //contiene tutti i metodi per la rappresentaz a video
public:
Video();
~Video(){destroy_bitmap(buf);}
/// w=wide, h=height dimensioni finestra
void InitDisplay(int disp,int w, int h){ /*inizializza la parte grafica
ATTENZIONE: w e h devono essere dichiarate
come variabili globali*/
set_color_depth(disp);
set_palette(colori);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, w, h, 0, 0);
buf = create_bitmap(w, h);
clear(buf);
}
void DB(int w,int h){ //doppio buffer
vsync();
blit(buf, screen, 0, 0, 0, 0, w, h);
clear(buf);
}
};

class Sprite{
int x,y;
public:
Sprite(int setx,int sety){sprite = load_bmp("pacstop.bmp",colori);x=setx; y=sety;}
~Sprite(){destroy_bitmap(sprite);}
int Getx(){return x;}
int Gety(){return y;}
void Mostra(){draw_sprite(buf,sprite,Getx(),Gety());}
void Move(){
if (key[KEY_UP]){y-=1;if(y<=0)y=0;}
if (key[KEY_DOWN]){y+=1;if(y>=h)y=h;}
if (key[KEY_LEFT]){x-=1;if(x<=0)x=0;}
if (key[KEY_LEFT]){x+=1;if(x>=w)x=w;}
}
};



//
//
//------------------------------------------------------------
//INIZIO PROGRAMMA MAIN
void main(){
allegro_init();
install_keyboard();
//--------------------- SPAZIO PER ISTANZIARE GLI OGGETTI ---------------------
Video MainGame; //inizializzo un oggetto di tipo Video chiamo MainGame
Sprite Player(200,200); //istanzio un oggetto tipo Sprite nella posiz 200,200
//-----------------------------------------------------------------------------
//
//----------------- EVENTUALE INIZIALIZZAZ VARIABILI --------------------
w=640;h=480;
//ho impostato le dimensioni della finestra
//-----------------------------------------------------------------------
MainGame.InitDisplay(32,w,h);


//------------------------- CARICA IMG E SPRITE -------------------------
// forse superfluo xkè si fa con i metodi di classe
//-----------------------------------------------------------------------



//------------------------- INIZIO CICLO WHILE CHE SI RIPETE------------------------
while (!key[KEY_ESC]) {

MainGame.DB(w,h); /* inserisco qui la procedutra creata precedentemente per la
visualizzazione schermo 'doppiobuffering();' */
Player.Move();
Player.Mostra();


}
//---------------------------------------------------------------------------
// DISTRUZIONE DI TUTTE LE IMG PRESENTI IN MEMORIA
Player.~Sprite();
MainGame.~Video();

//--------------------------------------------------------------------------
}END_OF_MAIN();

il linker mi dice:
Error 1 error LNK2019: unresolved external
symbol "public: __thiscall Video::Video(void)" (??0Video@@QAE@XZ) referenced in
function "void __cdecl _mangled_main(void)" (?_mangled_main@@YAXXZ) prova
object oriented.obj


Non riesco a capire cosa c'è che non va :( . Un'altra cosa, così la prox volta magari riesco a capire: come va interpretato il messaggio sopra del linker? Cioè gli manca qualcosa?
Grazie a tutti :D

cionci
26-03-2008, 11:51
Dove lo implementi il costruttore di default ?

Dani88
26-03-2008, 13:32
è vero cavoli :D manca {} :) (non deve fare nulla per ora...
Grazie mille :D

Dani88
26-03-2008, 14:29
già che ci sono un'altra cosa: se lascio i 2 distruttori in fondo, quando premo ESC mi esce la finestra che dice che si è verificato un errore se voglio debuggare con VS 2005, se invece gli dico di ignorarli usando // il programma si chiude tranquillamente. Non riesco a capire il motivo...i distruttori devo chiamarli io giusto? Non fanno da soli...

cionci
26-03-2008, 14:37
No, vengono chiamati da soli sugli oggetti allocati staticamente. Sugli oggetti allocati con new vengono chiamati quando fai la delete.

Dani88
26-03-2008, 16:45
ah ok, infatti mi ricordavo una cosa di questo tipo ma siccome VS me li dava tra i metodi della classe mi è venuto il dubbio che li dovessi chiamare io.
Altra piccola curiosità/dubbio (scusa se ne approfitto :D ma siccome abbiamo iniziato le classi da poco all'uni a volte ho qualche dubbio)
Se io creo una classe pippo così:

class pippo{
int x,y; //settate col costruttore a 0
public:
//metodi vari
};

se poi istanzio 2 oggetti tipo
pippo obj1;
pippo obj2;

Ognuno dei 2 oggetti ha una sua x e una sua y?
cioè se modifico x=2 e y=4 di obj2, quelle di obj1 rimangono a 0 giusto?

cionci
26-03-2008, 16:50
Tutto giusto. Sono due istanze diverse. Al contrario se usi la parola static hai una sola istanza del membro per tutte le istanze di quella classe.