为什么不编译此代码?
我有以下文件:
shape.h:
#import <Foundation/Foundation.h>
@interface Shape : NSObject{}
-(double)getArea;
-(void)Log;
@end
circle.h:
#import "Shape.h"
@interface Circle : Shape {}
@property (assign, nonatomic, readwrite) double radius;
@end
circle.m:
#import "Circle.h"
#include <math.h>
@implementation Circle : Shape
-(void)setRadius:(double)radius{}
-(double)getArea{
return self.radius * self.radius * M_PI;
}
-(void)Log{
NSLog(@"The circle has an area of %f.", self.getArea)
}
@end
和 main.m:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Circle.h"
int main(int argc, char * argv[]) {
Circle *c = [Circle alloc];
c.radius = 10;
[c Log];
return 0;
}
我犯了错误:
架构x86_64的未定义符号:
我想念什么?
答案 0 :(得分:1)
在Obj-C中,@interface
声明了一个类。所有课程都需要@implementation
。在所有类似C语言(C / C ++ / Obj-C)的语言中,头文件是一个承诺 - &#34;你在这里看到的是在某处实现的#34;。如果未履行承诺(缺少实现),您将收到编译(链接)错误。
在这种情况下,您缺少Shape
类的实现。
我能理解你的困惑,特别是当你来自一种interface
意味着一套抽象方法的语言时。在Obj-C中,类似的东西被称为@protocol
。此外,Obj-C中没有抽象方法/类。还必须实现声明的每个方法(除非它是协议@optional
方法)。
答案 1 :(得分:0)
您应该创建一个shape.m文件,其中包含这些方法的默认实现,或者根据您的需要将其作为协议。