2

子クラス「Circle」、「Triangle」、「Rectangle」を持つ親クラス「Shape」を作成しようとしています。親クラスは、x 位置、y 位置、塗りつぶしの色、またはすべての「形状」を保持し、各子クラスはその形状に固有の情報を保持します。オブジェクトの配列に半径を設定しようとすると、私のコードを調べて、「シェイプにメンバー 'setRadius' がありません」というエラーが表示される理由を理解してください...

PS現在、動作するまで子クラス「Circle」しかありません。次に、他の 2 つのクラスを追加します。

また、私のコードに他のエラーが見られる場合は、指摘していただければ幸いです。

前もって感謝します

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

3 に答える 3

2

の型GCir[i]Shape*あり、ShapeクラスにはsetRadiusメソッドがありCircleません。setRadiusしたがって、Circleオブジェクトを割り当てる前にオブジェクトを呼び出すか、適切な半径で をGCir[i]構築するだけです。CircleGCir[i] = new Circle(random(1,25));

于 2012-05-13T06:22:23.863 に答える
1

ハンマー修正:

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

に変更する必要があります

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

より深い問題:

BaseClass に仮想デストラクタが必要です

これを行うより良い方法は、Circle クラス コンストラクターで半径を取得することです。次に、Shape::draw() を仮想関数として使用して形状の描画を指定するか、Shape::getType() を実装してスイッチ ケースを使用し、適切なキャスト後に描画ロジックを決定します。

于 2012-05-13T06:16:21.850 に答える
0

コンパイラはそれを言った。円に対してのみ定義されているsetRadiusを呼び出そうとするShapesの配列があります。Shape poonterを円にキャストせずにのみ、shapeメソッドを呼び出すことができます。

于 2012-05-13T06:14:54.437 に答える