PDA

Visualizza la versione completa : [C++] Errori generici (undefined reference) in classi


simop_075
02-11-2008, 20:38
#include "allegro.h"

BITMAP *buf, *sprite ;
PALETTE colori;// l’inclusione delle librerie di allegro e con la definizione
//della variabile delle palette.
void doppiobuffering(){


class Video{ //dichiarazione di una classe..
//una classe è formata da un costruttore .. nome()
//da un distruttore ~nome()
//e poi da due metodi


public:
Video(){

allegro_init();

install_keyboard();

};
//alla creazione dell’oggetto di tipo Video, vengono chiamate le procedure
//d’inizializzazione di allegro e quelle per l’installazione della tastiera.
~Video(){

destroy_bitmap(buf);

}//Il distruttore di Video permette il recupero della memoria attraverso la
//funzione destroy_bitmap(buf) applicata al buffer.

void Display(int Disp,int n,int m){
set_color_depth(32);
set_palette(colori);
set_gfx_mode(GFX_AUTODETECT, n, m, 0, 0);
buf = create_bitmap(n, m);
clear(buf);
}//Il metodo Display di Video fa si che un oggetto di questo tipo, attraverso
//tale metodo sia in grado di settare la profondità del colore e la risoluzione
// assegnando i valori disp (per la profondità del colore) a
//set_color_depth(disp), settando le palette ed assegnando i valori n ed m a
//set_gfx_mode(GFX_AUTODETECT, n, m, 0, 0), ed al range di creazione del buffer
//con buf = create_bitmap(n, m) che viene pulito con clear (buf).

void DB(int n,int m){
vsync();
blit(buf, screen, 0, 0, 0, 0, n, m);
clear(buf);
}//Il metodo DB non fa altro che attuare il doppio buffering di cui conosciamo
//bene il funzionamento.

};// compito della classe:
//gestire le operazioni di messa a video delle immagini.
//la classe è formata da, ha un costruttore, un distruttore e due metodi,
//Display e DB che vedremo poi nello specifico.


class Giocatore{ //dichiarazione di una classe

int x,y; //membri privati

public:
Giocatore(){
sprite = load_bmp("player.bmp",colori);
x=10; y=30;
}//Il costruttore di Giocatore fa si che un oggetto di questo tipo sia in grado
//al nascere di caricare l’immagine bitmap dello sprite e di definire le sue
//coordinate iniziali.

~Giocatore(){
destroy_bitmap(sprite);
} //distrugge la memoria utilizzata


void Muovi(){

if (key[KEY_LEFT])x-=2;if(x<=0)x=0;

if (key[KEY_RIGHT])x+=2;if(x>=266)x=266;

if (key[KEY_UP])y-=2;if(y<=0)y=0;

if (key[KEY_DOWN])y+=2;if(y>=138)y=138;

}
int putx(){
return x;
}

int puty(){
return y;
}
void vedi(){
draw_sprite(buf, sprite, putx(), puty());
}//richiamare la procedura per il disegno dello sprite a schermo.

//I metodi Put x ed y (che sono metodi pubblici) servono ad accedere ai
//membri x ed y (privati e quindi inaccessibili dall’esterno se non
//attraverso dei metodi appripriati) come una buona programmazione OO
//richiede.


//Compito della classe:
//gestire le operazioni che riguardano il nostro sprite, che per adesso ha
//un’unica funzione che è quella di comparire a video.


//Nel main andremo a dichiarare due oggetti, uno per ogni classe implementata.
//Quindi l’oggetto Game gestisce i problemi generali di messa a video delle
//immagini e l’oggetto Nave rappresenta il nostro sprite.
};
}
int main()
{
Video.Game;
Giocatore.Nave;
set_color_depth(32);//aggiorniamo le palette
set_palette(colori);
//Game ha un metodo Display che permette di settare la risoluzione video,
//nel nostro caso a 320 per 200 e di dare una profondità di colore a 32 bit.

Game.Display(32,320,200);
//Con un ciclo while che termina quando viene premuto il tasto ESC l’oggetto
// Game chiama il metodo DB che implementa il doppio buffering che noi già
//conosciamo. L’oggetto nave compare a video attraverso il metodo Vedi.

while (!key[KEY_ESC]) {

Game.DB(320,200);
Nave.Vedi();
}


}
END_OF_MAIN ();

mi dice che non ho dichiarato video game giocatore nave...
ma non penso di doverle dichiarare.. potete aiutarmi?

oregon
02-11-2008, 22:26
Non so perche' tu l'abbia scritto cosi'

Video.Game;
Giocatore.Nave;

ma il punto non c'entra nulla ... deve essere

Video Game;
Giocatore Nave;

simop_075
03-11-2008, 15:22
grazie....

comunque mi da ancora l'errore... come mai?

Stoicenko
03-11-2008, 15:43
2 cose..

1) usa i tag code perchè in questo modo senza rientro del codice non si capisce nulla di dove iniziano e dove finiscono dischiarazioni e implementazioni di classi e metodi..

2) set_color_depth e set_palette dove sono dichiarati?

MacApp
03-11-2008, 16:06
Originariamente inviato da simop_075
comunque mi da ancora l'errore... come mai?
L'errore dobbiamo indovinarlo? Non puoi copia/incollarlo?

simop_075
03-11-2008, 20:56
`Video' undeclared (first use this function)

(Each undeclared identifier is reported only once for each function it appears in.)
`Giocatore' undeclared (first use this function)
expected `;' before "Nave"
`Game' undeclared (first use this function)
`Nave' undeclared (first use this function)

eccoli.. grazie.. xd

oregon
03-11-2008, 21:02
Sicuramente mancano gli include delle classi nel file del main ... ma se non usi i tag CODE e non sistemi il codice, non si capisce nulla ...

simop_075
03-11-2008, 22:51
#include "allegro.h"

BITMAP *buf, *sprite ;
PALETTE colori;
void doppiobuffering(){


class Video{
public:
Video(){

allegro_init();

install_keyboard();

};

~Video(){

destroy_bitmap(buf);

}

void Display(int Disp,int n,int m){
set_color_depth(32);
set_palette(colori);
set_gfx_mode(GFX_AUTODETECT, n, m, 0, 0);
buf = create_bitmap(n, m);
clear(buf);
}

void DB(int n,int m){
vsync();
blit(buf, screen, 0, 0, 0, 0, n, m);
clear(buf);
}

};


class Giocatore{

int x,y;

public:
Giocatore(){
sprite = load_bmp("player.bmp",colori);
x=10; y=30;
}

~Giocatore(){
destroy_bitmap(sprite);
}


void Muovi(){

if (key[KEY_LEFT])x-=2;if(x<=0)x=0;

if (key[KEY_RIGHT])x+=2;if(x>=266)x=266;

if (key[KEY_UP])y-=2;if(y<=0)y=0;

if (key[KEY_DOWN])y+=2;if(y>=138)y=138;

}
int putx(){
return x;
}

int puty(){
return y;
}
void vedi(){
draw_sprite(buf, sprite, putx(), puty());
}

};
}
int main()
{
Video Game;
Giocatore Nave;
set_color_depth(32);
set_palette(colori);

Game.Display(32,320,200);

while (!key[KEY_ESC]) {

Game.DB(320,200);
Nave.Vedi();
}


}
END_OF_MAIN ();


gli errori...



`Video' undeclared (first use this function)

(Each undeclared identifier is reported only once for each function it appears in.)
`Giocatore' undeclared (first use this function)
expected `;' before "Nave"
`Game' undeclared (first use this function)
`Nave' undeclared (first use this function)

MacApp
03-11-2008, 23:13
Ti consiglio di partire da un progetto piu' semplice.

oregon
04-11-2008, 00:28
Se metti in ordine il codice (con una corretta indentazione) ti accorgi subito del perche' hai tutti quegli errori ... Per esempio, solo le righe iniziali



#include "allegro.h"

BITMAP *buf, *sprite ;
PALETTE colori;

void doppiobuffering()
{
class Video
{
public:
Video()
...


... mi spieghi cosa ci fa la class Video dentro la funzione doppiobuffering?

Loading