2015-02-10 75 views
-2

爲什麼這段代碼不能構建?Objective C繼承: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:

Build error

我怎麼錯過?

+6

你的'shape.m'文件在哪裏? – rmaddy 2015-02-10 02:55:51

+0

我以爲我可能不會實現形狀界面。謝謝。 – koryakinp 2015-02-10 02:58:29

+0

所有的Objective-C類都需要實現。 – rmaddy 2015-02-10 02:59:45

回答

1

在Obj-C中,@interface聲明瞭一個類。所有課程也需要有@implementation。在所有C語言(C/C++/Obj-C)語言中,頭文件是一個承諾 - 「你在這裏看到的是在某處實現的」。如果承諾未履行(缺少實施),您將收到編譯(鏈接)錯誤。

在這種情況下,您錯過了Shape類的實現。

我可以理解你的困惑,特別是當你來自一種語言,其中interface意味着一組抽象的方法。在Obj-C中,類似的東西叫做@protocol。另外,Obj-C中沒有抽象方法/類。宣佈的每種方法也必須實施(除非它是一種協議@optional方法)。

0

您應該爲這些方法創建一個帶默認實現的shape.m文件,或者根據您的需要將其設置爲協議。