2011-05-18 55 views
5

// 9.1.h未完全執行(Xcode的錯誤?)

#import <Foundation/Foundation.h> 


@interface Complex : NSObject 
{ 

    double real; 
    double imaginary; 

} 

@property double real, imaginary; 
-(void) print; 
-(void) setReal: (double) andImaginary: (double) b; 
-(Complex *) add: (Complex *) f; 

@end 

#import "9.1.h" 


@implementation Complex 

@synthesize real, imaginary; 

-(void) print 
{ 
    NSLog(@ "%g + %gi ", real, imaginary); 
} 

-(void) setReal: (double) a andImaginary: (double) b 
{ 
    real = a; 
    imaginary = b; 
} 

-(Complex *) add: (Complex *) f 
{ 
    Complex *result = [[Complex alloc] init]; 

    [result setReal: real + [f real] andImaginary: imaginary + [f imaginary]]; 

    return result; 

} 
@end 

在最後@end線時,Xcode告訴我的實現是不完整的。該代碼仍然按預期工作,但我是新手,擔心我錯過了一些東西。據我所知,它是完整的。有時候我覺得Xcode會掛在過去的錯誤上,但也許我只是失去了主意!

謝謝! -Andrew

+0

難道是因爲真正的參數沒有在你的界面'有一個名字 - (無效)setReal:(雙)andImaginary:(雙)B;' – jjwchoy 2011-05-18 18:05:38

+0

肯尼已經回答了這個問題,但我只是想要指出的是從一個像-add: – 2011-05-18 18:05:43

+0

這樣的方法返回一個自動釋放對象是一種慣例,對於像這樣的Value類型,將它們設置爲不可變的是一種很好的做法,即在構造函數中設置實部和虛部以及不要提供任何方法來改變它們。您是否有特定的需求來修改一旦創建的複雜實例? – jjwchoy 2011-05-18 18:09:53

回答

10

9.1.h中,您錯過了'a'。

-(void) setReal: (double) andImaginary: (double) b; 
//      ^here 

的代碼仍然是有效的,因爲在Objective-C選擇的部分可以沒有名字,例如

-(id)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y 
//         ^  ^  ^

這些方法被稱爲

return [self initWithControlPoints:0.0f :0.0f :1.0f :1.0f]; 
//         ^ ^ ^

和選擇的名字自然是@selector(initWithControlPoints::::)

因此,編譯器會解釋你的宣言作爲

-(void)setReal:(double)andImaginary 
       :(double)b; 

因爲你還沒有提供這個-setReal::方法的實現,GCC會警告你

warning: incomplete implementation of class ‘Complex’ 
warning: method definition for ‘-setReal::’ not found 

順便說一句,如果你只需要一個複雜的值,但不需要它是一個Objective-C類,有C99 complex,例如

#include <complex.h> 

... 

double complex z = 5 + 6I; 
double complex w = -4 + 2I; 
z = z + w; 
printf("%g + %gi\n", creal(z), cimag(z)); 
+1

謝謝,我正在失去它。 – jag 2011-05-18 18:17:59