楼主新手,最近在学习Objective C,今天在看面向对象编程基础知识时敲了一段代码。 编程
/* 数组
Shapes-Procedural使用的是普通的C语言和过程式编程风格。代码的开始要定义一些常量和结构。 函数
*/ 学习
/*在强制包含了基础头文件以后,经过枚举指定了能够绘制的几种不一样形状:圆形,方形和不规则的椭圆形*/ spa
#import <Foundation/Foundation.h> 对象
/*C语言枚举的语法 ci
typedef enum it
{ io
枚举值1, 编译
枚举值2,
.....
枚举值n
}枚举名称;
*/
/*经过枚举指定了能够绘制的几种不一样形状:圆形,方形和不规则的椭圆形*/
typedef enum
{
kCircle,
kRectangle,
kOblateSpherold
}ShapeType;
/*下面的enum定义了绘制形状时可用的颜色*/
typedef enum
{
kRedColor,
kGreenColor,
kBlueColor
}ShapeColor;
/*C的Struct元素的语法
typedef struct
{
结构值1;
结构值2;
.....
结构值n;
}结构名称;
*/
/*而后,咱们使用一个结构来描述一个矩形,此矩形指定屏幕上绘制形状的区域*/
typedef struct
{
int x,y,width,height;
}ShapeRect;
/*最后,咱们用一个结构将全部内容结合起来,描绘一个形状*/
typedef struct
{
ShapeType type;
ShapeColor fillColor;
ShapeRect bounds;
}Shape;
/*方法:这里边有一个比较恶心的问题,定义方法必定要严格按照顺序,否则就会出现 conflicting types for ‘方法名’ 的错误*/
NSString *colorName(ShapeColor color)
{
switch (color) {
case kRedColor:
return @"red";
break;
case kGreenColor:
return @"green";
break;
case kBlueColor:
return @"blue";
break;
}
return @"no clue";
}
void drawCircle(ShapeRect bounds,ShapeColor fillColor)
{
NSLog(@"drawing a circle at (%d %d %d %d) in %@",
bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}
void drawRectangle(ShapeRect bounds,ShapeColor fillColor)
{
NSLog(@"drawing a rectangle at (%d %d %d %d) in %@",
bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}
void drawOblateSpheroid(ShapeRect bounds,ShapeColor fillColor)
{
NSLog(@"drawing a oblateSpheroid at (%d %d %d %d) in %@",
bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}
void drawShapes(Shape shapes[],int count)
{
int i;
for(i=0;i<count;i++)
{
switch(shapes[i].type)
{
case kCircle:
drawCircle(shapes[i].bounds, shapes[i].fillColor);
break;
case kRectangle:
drawRectangle(shapes[i].bounds, shapes[i].fillColor);
break;
case kOblateSpherold:
drawOblateSpheroid(shapes[i].bounds, shapes[i].fillColor);
break;
}
}
}
/*在咱们的例子中,main()声明咱们要绘制的形状的数组。声明数组以后,数组中的每一个形状结构都经过分配字段而被初始化。
下面的代码将产生一个红色的圆形,一个绿色的矩形和一个蓝色的椭圆形*/
int main(int argc, char *argv[])
{
/*
Shapes-Procedural程序的main()方法中的矩形时使用C语言方便的小技巧声明的;声明结构变量时,你能够一次性初始化该结构的全部元素。 ShapeRect rect0(0,0,10,30);
结构元素按照声明的顺序取值。
typedef struct
{
int x,y,width,height;
}ShapeRect
上面对rect0的赋值表示rect0.x和rect0.y的值都为0,rect0.width为10,rect0.height的值为30.
此技巧能够减小程序中需输入的字符量,而且不会牺牲可读性。
*/
Shape shapes[3];
ShapeRect rect0={0,0,10,30};
shapes[0].type =kCircle;
shapes[0].fillColor=kRedColor;
shapes[0].bounds=rect0;
ShapeRect rect1={30,40,50,60};
shapes[1].type =kRectangle;
shapes[1].fillColor=kGreenColor;
shapes[1].bounds=rect1;
ShapeRect rect2={15,18,37,29};
shapes[2].type =kOblateSpherold;
shapes[2].fillColor=kBlueColor;
shapes[2].bounds=rect2;
drawShapes(shapes, 3);
return (0);
}
/*运行结果
2012-11-11 11:53:00.115 Shapes-Procedural[813:f803] drawing a circle at (0 0 10 30) in red
2012-11-11 11:53:00.121 Shapes-Procedural[813:f803] drawing a rectangle at (30 40 50 60) in green
2012-11-11 11:53:00.122 Shapes-Procedural[813:f803] drawing a oblateSpheroid at (15 18 37 29) in blue
*/
固然,这段代码能够正常运行,这是楼主修改后的样子。
以前楼主是彻底按照书本上的顺序敲的,将main()的实现写在drawShapes(),drawCircle(),drawRectangle()...以前. 结果编译的时候出现了 conflicting types for "方法名"的错误。故到网上查找答案,发如今这里须要严格按照函数出现的前后顺序才能成功编译,也就是main()要定义在最后,由于它是执行入口,它里边用到的全部对象,全部方法都须要按照顺序定义在它以前,若是在这些方法里边还用到了方法,那么固然还要将其余方法定义在这些方法以前。
楼主分享了,但愿能够帮到其余人。
顺便祝愿:“众屌丝节日快乐”!