2011-05-18 34 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