樓主新手,最近在學習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()要定義在最後,由於它是執行入口,它裏邊用到的全部對象,全部方法都須要按照順序定義在它以前,若是在這些方法裏邊還用到了方法,那麼固然還要將其餘方法定義在這些方法以前。
樓主分享了,但願能夠幫到其餘人。
順便祝願:「衆屌絲節日快樂」!