我正在尝试使用子类“Circle”,“Triangle”,“Rectangle”创建父类“Shape”。父类保存x pos,y pos和填充颜色或所有“形状”,然后每个子类保存特定于该形状的信息。有人会介意查看我的代码,看看为什么我在尝试设置对象数组中的半径时得到错误“Shapes没有成员'setRadius'”...
P.S。现在我只有孩子类“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;
}
答案 0 :(得分:2)
GCir[i]
的类型为Shape*
,Shape
类没有setRadius
方法,Circle
。因此,请先将setRadius
对象调用Circle
,然后再将其分配给GCir[i]
,或者只使用正确的半径构建Circle
:GCir[i] = new Circle(random(1,25));
答案 1 :(得分:1)
锤子修复:
GCir[i]->setRadius(random(1,25));
应改为
((Circle*)GCir[i])->setRadius(random(1,25));
更深层次的问题:
你需要在BaseClass
上使用虚拟析构函数更好的方法是在Circle类构造函数中获取半径。 然后使用Shape :: draw()作为虚函数来指定形状绘制或实现Shape :: getType()并使用switch case在正确转换后确定绘图逻辑。
答案 2 :(得分:0)
编译器说。你有一个Shapes数组,你尝试调用setRadius,它只为Circles定义。您只能调用形状方法而不将Shape poonter转换为圆形。