Анимация массива объектов дочернего класса

Я пытаюсь создать родительский класс «Форма» с дочерними классами «Круг», «Треугольник», «Прямоугольник». Родительский класс содержит позицию x, позицию y и цвет заливки или все «формы», а затем каждый дочерний класс содержит информацию, относящуюся к этой форме. Кто-нибудь возражал бы просмотреть мой код и понять, почему я получаю сообщение об ошибке «Фигуры не имеют члена« 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;
}

person AGSperry    schedule 13.05.2012    source источник


Ответы (3)


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

person Eugen Constantin Dinca    schedule 13.05.2012

исправление молотка:

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

следует изменить на

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

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

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

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

person mohaps    schedule 13.05.2012

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

person dbrank0    schedule 13.05.2012
comment
Я еще не изучал кастинг в классе, поэтому я понятия не имею, что это такое или что он делает ... :) не забудьте объяснить, как я могу это исправить ... Надеюсь, вы видите, что я пытаюсь сделать ... в основном, используя allegro , иметь несколько фигур, прыгающих по экрану. Как только я заставлю круги работать, я смогу заставить работать и другие фигуры. - person AGSperry; 13.05.2012
comment
Указание компилятору угрожать одному типу как другому (синтаксис, показанный в ответе mohaps) называется кастингом. См. en.wikibooks .org/wiki/C%2B%2B_Programming/Programming_Languages/, чтобы узнать больше. - person dbrank0; 13.05.2012