Objective C 继承:未定义的符号
Objective C inheritance: undefined symbols
为什么此代码无法构建?
我有以下文件:
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;
}
而且我有构建错误:
Undefined symbols for architecture x86_64:
我错过了什么?
您应该创建一个包含这些方法默认实现的 shape.m 文件,或者根据您的需要将其设为协议。
在 Obj-C 中,@interface
声明了一个 class。所有 classes 还需要有 @implementation
。在所有类 C (C/C++/Obj-C) 语言中,头文件是一个承诺 - "what you see here is implemented somewhere"。如果未实现承诺(缺少实现),则会出现编译(链接)错误。
在这种情况下,您缺少 Shape
class 的实现。
我能理解您的困惑,尤其是当您来自一种 interface
表示一组抽象方法的语言时。在Obj-C中,类似的东西叫做@protocol
。此外,Obj-C 中没有抽象 methods/classes 。声明的每个方法也必须实现(除非它是协议 @optional
方法)。
为什么此代码无法构建?
我有以下文件:
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;
}
而且我有构建错误:
Undefined symbols for architecture x86_64:
我错过了什么?
您应该创建一个包含这些方法默认实现的 shape.m 文件,或者根据您的需要将其设为协议。
在 Obj-C 中,@interface
声明了一个 class。所有 classes 还需要有 @implementation
。在所有类 C (C/C++/Obj-C) 语言中,头文件是一个承诺 - "what you see here is implemented somewhere"。如果未实现承诺(缺少实现),则会出现编译(链接)错误。
在这种情况下,您缺少 Shape
class 的实现。
我能理解您的困惑,尤其是当您来自一种 interface
表示一组抽象方法的语言时。在Obj-C中,类似的东西叫做@protocol
。此外,Obj-C 中没有抽象 methods/classes 。声明的每个方法也必须实现(除非它是协议 @optional
方法)。