2011-04-13 18 views
1

嘿,我是新來的編程和通過一本Objective-C書來學習語言和編程基礎知識。我已經反覆查看代碼,回到本書的示例,並嘗試瞭解gcc comple錯誤。這裏是我的代碼:gcc在一個基本的例子objc程序中編譯錯誤

#import <stdio.h> 
#import <objc/Object.h> 

@interface Point: Object 
    { 
     int xaxis; 
     int yaxis; 
    } 

    -(void) print; 
    -(void) setx: (int)x; 
    -(void) sety: (int)y; 

@end 

@implementation Point; 

    -(void) print 
     { 
      printf("(%i,%i)", xaxis, yaxis); 
     } 

    -(void) setx: (int) x 
     { 
      xaxis = x; 
     } 

    -(void) sety: (int) y 
     { 
      yaxis = y; 
     } 
@end 

int main (int argc, char *argv[]) 
    { 
     Point *myPoint; 

     myPoint = [Point alloc]; 

     myPoint = [myPoint init]; 

     [myPoint setx: 4]; 
     [myPoint sety: 5]; 

     printf("The coordinates are: "); 
      [myPoint print]; 
     printf("\n"); 

     [myPoint free]; 

     return 0; 

    } 

然後從GCC這個樣子的編譯錯誤:

urban:Desktop alex$ gcc point.m -o point -l objc 
point.m: In function ‘main’: 
point.m:38: warning: ‘Point’ may not respond to ‘+alloc’ 
point.m:38: warning: (Messages without a matching method signature 
point.m:38: warning: will be assumed to return ‘id’ and accept 
point.m:38: warning: ‘...’ as arguments.) 
point.m:40: error: ‘mypoint’ undeclared (first use in this function) 
point.m:40: error: (Each undeclared identifier is reported only once 
point.m:40: error: for each function it appears in.) 
point.m:49: warning: ‘Point’ may not respond to ‘-free’ 

我要去哪裏錯了?

btw如果你想知道,我正在通過Stephen Kochan的「Objective-C編程」。

+0

在哪個平臺上編譯程序? – 2011-04-13 06:58:21

+0

我正在使用Mac OS X. 10。6 – imgeekboy 2011-04-13 07:38:19

+1

在這種情況下,最好使用'NSObject'而不是'Object',因爲Mac OS X上的股票編譯器使用Objective-C 2.0,它不會將Object作爲全功能的根類來構建。 – 2011-04-13 07:42:27

回答

0

你有警告和錯誤。警告似乎表明Object(您正在進行子類化)不會執行alloc,initfree。通常情況下,在蘋果平臺上,您可以繼承NSObject的子類,該子類可以實現這些功能,但不知道您正在使用哪種平臺,因此無法建議正確的選項。

其次,你有一個錯字,但現在似乎已被糾正。這

point.m:40: error: ‘mypoint’ undeclared (first use in this function) 

建議你在你的代碼有mypoint,而不是myPoint

+0

感謝您的迴應。我糾正了錯字,在同一語句中初始化並分配了對象('Point * myPoint = [[Point alloc] init];')將子類更改爲NSObject並將''切換爲''。是的,我在Mac上。當我編譯時,我得到'point.m:6:error:'Point'被重新聲明爲不同類型的符號 /System/Library/Frameworks/CoreServices.framework/Headers/../Frameworks/CarbonCore.framework/Headers/MacTypes。 h:501:錯誤:之前的'Point'聲明 point.m:9:錯誤:重新定義'struct Point''並且當我嘗試運行該程序時: – imgeekboy 2011-04-13 07:17:12

+0

'urban:Desktop alex $ ./point objc [ 60472]:點:無法識別選擇器正向:: 非法指令 都市:桌面alex $' – imgeekboy 2011-04-13 07:17:55

+1

@imgeekboy使用Apple框架的問題是'Point'已經在Carbon中聲明爲'struct'。將你的'Point'類重命名爲其他內容,例如'MyPoint',你的代碼應該編譯並運行得很好。 – 2011-04-13 07:46:32

0

你忘了,包括頭Foundation.h:

#import <Foundation/Foundation.h> 
2

首先,基類應該是NSObject的,而不是Object

正常的方式做初始化寫的alloc和init在同樣的聲明。你通常會有 - (id)init;方法類:

-(id)init 
{ 
    if ((self = [super init])) 
    { 
    ; // additional initialization goes here 
    } 
    return self; 
} 

int main (int argc, char *argv[]) 
    { 
     Point *myPoint = [[Point alloc] init]; 

性能得到更好的利用,那麼你得到的setter和getter你

,而不是

@interface Point: Object 
    { 
     int xaxis; 
     int yaxis; 
    } 

寫自動生成

@interface Point : NSObject 
{ 
} 

@property int xaxis; 
@property int yaxis; 

那麼當你分配你可以寫

[myPoint setXaxis:4] 

myPoint.xaxis = 4; 

當你釋放對象寫的釋放,不能自由

[myPoint release]; 

心連心

+0

根據運行時間的不同,「對象」是一個有效的根類。 – 2011-04-13 07:02:41