conflicting types for ‘方法名’ 的错误

杀马特。学长 韩版系。学妹 提交于 2019-12-10 09:15:44

     楼主新手,最近在学习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()要定义在最后,因为它是执行入口,它里边用到的所有对象,所有方法都需要按照顺序定义在它之前,如果在这些方法里边还用到了方法,那么当然还要将其他方法定义在这些方法之前。

    楼主分享了,希望可以帮到其他人。

    顺便祝愿:“众屌丝节日快乐”!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!