2012-05-13 15 views
2

Я пытаюсь создать родительский класс «Форма» с дочерними классами «Круг», «Треугольник», «Прямоугольник». Родительский класс содержит x pos, y pos и цвет заливки или все «фигуры», а затем каждый дочерний класс содержит информацию, специфичную для этой формы. Кто-нибудь мог бы взглянуть на мой код и посмотреть, почему я получаю ошибку «У форм нет члена setRadius» при попытке установить радиус в массиве объектов ...Анимация массива объектов дочернего класса

P.S. прямо сейчас у меня есть только дочерний класс «Круг», пока я не получу его работу. Затем я добавлю два других класса.

Кроме того, если кто-либо видит какие-либо другие ошибки в моем коде, я был бы признателен им за то, что они указаны.

Заранее спасибо

#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; 
} 

ответ

0

Компилятор сказал. У вас есть массив фигур, на которых вы пытаетесь вызвать setRadius, который определен только для кругов. Вы можете вызывать только методы формы без каста Shape poonter.

+0

Я не узнал кастинг еще в классе, так что я понятия не имею, что это такое или то, что это делает ... :) ум, объясняющий, как я могу это исправить ... Надеюсь, вы увидите, что я пытаюсь сделать ... basicall using allegro, иметь несколько фигур, «подпрыгивающих» вокруг экрана. Как только я получу круги, я могу заставить другие фигуры работать. – AGSperry

+0

Говоря компилятору, чтобы угрожать одним типом, как другой (синтаксис, показанный в ответе mohaps), называется литой. См. Http://en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/C%2B%2B/Code/Statements/Variables/Type_Casting для получения дополнительной информации. – dbrank0

1

молоток фикс:

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

должен быть изменен на

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

более глубокие проблемы:

вам нужно виртуальный деструктор на BaseClass

лучший способ сделать это состоит в возьмем радиус в конструкторе класса Circle. , либо используйте Shape :: draw() в качестве виртуальной функции, чтобы указать рисование фигуры или реализовать Shape :: getType() и использовать случай переключения для определения логики рисования после правильного кастинга.

2

Типа GCir[i] является Shape* и Shape класса не имеет методы setRadius, Circle делает. Так или вызвать setRadius на Circle объекта, прежде чем назначить его GCir[i] или просто построить Circle с правильным радиусом: GCir[i] = new Circle(random(1,25));

Смежные вопросы