对子类对象的数组进行动画处理
Animating an array of child class objects
>我正在尝试创建一个父类"形状",其中包含子类"圆形","三角形","矩形"。父类保存 x pos、y pos 和填充颜色或所有"形状",然后每个子类保存特定于该形状的信息。有人介意查看我的代码并了解为什么在尝试设置对象数组中的半径时出现错误"形状没有成员'setRadius'"......
附言现在我只有子类"圆圈",直到我让它工作。然后我将添加其他两个类。
另外,如果有人在我的代码中看到任何其他错误,我将不胜感激。
提前致谢
#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;
}
GCir[i]
的类型是Shape*
,Shape
类没有setRadius
方法,Circle
有。因此,要么在将Circle
对象分配给GCir[i]
之前调用setRadius
,要么只是使用适当的半径构造Circle
:GCir[i] = new Circle(random(1,25));
锤子修复:
GCir[i]->setRadius(random(1,25));
应改为
((Circle*)GCir[i])->setRadius(random(1,25));
更深层次的问题:
你需要基类上的虚拟析构函数
更好的方法是在 Circle 类构造函数中获取半径。然后使用 Shape::d raw() 作为虚拟函数来指定形状绘制,或者实现 Shape::getType() 并在正确转换后使用开关大小写来确定绘图逻辑。
编译器
说。您有一个形状数组,您尝试在其上调用 setRadius,该数组仅为圆形定义。只能调用形状方法,而不能将 Shape poonter 强制转换为圆形。
相关文章:
- 警告处理为错误这里有什么问题
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- 使用对象数组对 SFML 进行动画处理
- 围绕特定轴对 qt3d 旋转进行动画处理
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- 学习如何制作可以处理动画的程序的最佳方式
- QTableview单元格的值更新后,如何及时对它的颜色进行动画处理?
- 如何在 qt 中对 QPushButton 的背景颜色进行动画处理
- 无法在 qgraphicsItem 中对 QTransform 进行动画处理
- 对子类对象的数组进行动画处理
- QML如何对属性的每次更改进行动画处理?(只有最后一个更改动画可见)
- 如何在OpenGL中处理包含多个对象的动画