2012-05-13 3 views
2

J'essaie de créer une classe parente "Shape" avec des classes enfants "Circle", "Triangle", "Rectangle". La classe parent contient les couleurs x pos, y pos et fill ou toutes les "formes", puis chaque classe enfant contient des informations spécifiques à cette forme. Quelqu'un pourrait-il regarder par-dessus mon code et voir pourquoi je reçois l'erreur "Shapes n'a pas de membre 'setRadius'" lorsque vous essayez de définir le rayon dans le tableau d'objets ...Animation d'un tableau d'objets de classe enfant

P.S. En ce moment, je n'ai que la classe "Cercle" jusqu'à ce que je le fasse fonctionner. Ensuite, je vais ajouter les deux autres classes.

En outre, si quelqu'un voit d'autres erreurs dans mon code, j'apprécierais qu'ils soient signalés.

Merci à l'avance

#include <allegro.h> 
#include <cstdlib> 

using namespace std; 

#define scrX 640 
#define scrY 400 
#define WHITE makecol(255,255,255) 
#define GRAY makecol(60,60,60) 
#define BLUE makecol(17,30,214) 

int random(int low, int high); 

const int numCircles = random(1,50); 

class Shape{ 
    public: 
     Shape(){x = scrX/2; y = scrY/2; fill = WHITE;} 
    protected: 
     int x, y, fill;  
}; 
class Circle : public Shape{ 
    public: 
     Circle(){radius = 0;} 
     Circle(int r){radius = r;} 
     void setRadius(int r){radius = r;} 
    protected: 
     int radius; 
}; 
int main() 
{ 
    // Program Initialization 
    allegro_init(); 
    install_keyboard(); 
    set_color_depth(32); 
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, scrX, scrY, 0, 0); 

    // Create and clear the buffer for initial use 
    BITMAP *buffer = create_bitmap(scrX, scrY); 
    clear_to_color(buffer, GRAY); 

    // Set title and create label text in window 
    set_window_title("Bouncing Balls Ver 1.0"); 
    textout_ex(buffer, font, "Bouncing Balls Ver 1.0", 10, 20, WHITE, GRAY); 

    // Draw a background box 
    rectfill(buffer, 50, 50, scrX-50, scrY-50, BLUE); 

    // Create circles 
    Shape **GCir; 
    GCir = new Shape *[numCircles]; 
    for(int i=0;i<numCircles;i++){ 
     GCir[i] = new Circle; 
     GCir[i]->setRadius(random(1,25)); // THIS IS THE ERROR   
    } 

    while(!key[KEY_ESC]){ 
    blit(buffer, screen, 0, 0, 0, 0, scrX, scrY); 
    } 

    destroy_bitmap(buffer); 

    return 0; 
} 
END_OF_MAIN(); 
int random(int low, int high) 
{ 
    return rand() % (high - low) + low; 
} 

Répondre

0

compilateur ont dit. Vous avez un tableau de formes sur lequel vous essayez d'appeler setRadius qui est seulement défini pour les cercles. Vous pouvez seulement appeler des méthodes de forme sans lancer Shape poonter pour encercler.

+0

Je ne l'ai pas appris casting encore en classe, donc je ne sais pas ce qui est ou ce qui est fait ... :) esprit expliquant comment je peux résoudre ce problème ... J'espère que vous pouvez voir ce que j'essaie de faire ... basiquement, en utilisant allegro, avoir plusieurs formes "rebondissant" autour de l'écran. Une fois que les cercles fonctionnent, je peux faire fonctionner les autres formes. – AGSperry

+0

Raconter le compilateur pour menacer un type comme l'autre (la syntaxe montrée dans la réponse de mohaps) est appelé casting. Voir http://en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/C%2B%2B/Code/Statements/Variables/Type_Casting pour plus d'informations. – dbrank0

1

marteau fix:

GCir[i]->setRadius(random(1,25)); 

devrait être modifiée pour

((Circle*)GCir[i])->setRadius(random(1,25)); 

problèmes plus graves:

vous avez besoin destructor virtuel sur BaseClass

une meilleure façon de le faire est de Prenez le rayon dans le constructeur de la classe Circle. puis utilisez Shape :: draw() en tant que fonction virtuelle pour spécifier le dessin de forme ou implémenter Shape :: getType() et utiliser un cas de commutateur pour déterminer la logique de dessin après la conversion appropriée.

2

Le type de GCir[i] est Shape* et la classe Shape ne dispose pas d'une méthode setRadius, Circle fait. Donc, soit appeler setRadius sur l'objet Circle avant l'assigner à GCir[i] ou tout simplement construire le Circle avec le rayon approprié: GCir[i] = new Circle(random(1,25));