【问题标题】:Animating an array of child class objects为一组子类对象设置动画
【发布时间】:2012-05-13 06:05:02
【问题描述】:

我正在尝试使用子类“Circle”、“Triangle”、“Rectangle”创建一个父类“Shape”。父类保存 x 位置、y 位置和填充颜色或所有“形状”,然后每个子类保存特定于该形状的信息。有人会介意查看我的代码,看看为什么我在尝试设置对象数组中的半径时收到错误“形状没有成员'setRadius'”......

附:现在我只有子类“Circle”,直到我让它工作。然后我将添加其他两个类。

另外,如果有人在我的代码中发现任何其他错误,我将不胜感激。

提前致谢

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

【问题讨论】:

    标签: c++ arrays pointers allegro


    【解决方案1】:

    GCir[i] 的类型是 Shape*Shape 类没有 setRadius 方法,Circle 有。因此,要么在 Circle 对象上调用 setRadius,然后将其分配给 GCir[i],要么只构造具有适当半径的 CircleGCir[i] = new Circle(random(1,25));

    【讨论】:

      【解决方案2】:

      锤子修复:

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

      应该改为

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

      更深层次的问题:

      您需要 BaseClass 上的虚拟析构函数

      更好的方法是在 Circle 类构造函数中获取半径。 然后要么使用 Shape::draw() 作为虚函数来指定形状绘制,要么实现 Shape::getType() 并使用 switch case 来确定正确转换后的绘制逻辑。

      【讨论】:

        【解决方案3】:

        编译器说的。您有一个 Shapes 数组,您尝试在其上调用仅为 Circles 定义的 setRadius。您只能调用 shape 方法而不将 Shape poonter 转换为 circle。

        【讨论】:

        • 我还没有在课堂上学习铸造,所以我不知道那是什么或做什么...... :) 介意解释我如何解决这个问题......希望你能看到我在尝试什么要做...基本上使用快板,在屏幕上“弹跳”多个形状。一旦我让圆圈工作,我就可以让其他形状工作。
        • 告诉编译器威胁一种类型作为另一种类型(mohaps 的答案中显示的语法)称为强制转换。请参阅en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/… 了解更多信息。
        猜你喜欢
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多