楼主新手,最近在学习Objective C,今天在看面向对象编程基础知识时敲了一段代码。
/*
Shapes-Procedural使用的是普通的C语言和过程式编程风格。代码的开始要定义一些常量和结构。
*/
/*在强制包含了基础头文件之后,通过枚举指定了可以绘制的几种不同形状:圆形,方形和不规则的椭圆形*/
#import <Foundation/Foundation.h>
/*C语言枚举的语法
typedef enum
{
枚举值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()要定义在最后,因为它是执行入口,它里边用到的所有对象,所有方法都需要按照顺序定义在它之前,如果在这些方法里边还用到了方法,那么当然还要将其他方法定义在这些方法之前。
楼主分享了,希望可以帮到其他人。
顺便祝愿:“众屌丝节日快乐”!
来源:oschina
链接:https://my.oschina.net/u/861613/blog/88437