2011-05-18 7 views
5

// 9.1.haplicación incompleta (Xcode error?)

#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 

En la última línea @end, Xcode me está diciendo la implementación es incompleta. El código sigue funcionando como se esperaba, pero soy nuevo en esto y estoy preocupado de haberme perdido algo. Está completo por lo que puedo decir. A veces siento que Xcode se aferra a errores pasados, ¡pero tal vez estoy perdiendo la cabeza!

Gracias! -Andrew

+0

Podría ser porque el parámetro real no tiene un nombre en la interfaz de '- (void) setReal: (doble) andImaginary: (doble) b;' – jjwchoy

+0

Kenny respondió a la pregunta ya, pero yo sólo quería señalar que es una convención devolver un objeto liberado automáticamente a partir de un método como su -add: –

+0

Otro comentario, con tipos de valores como este, es una buena práctica hacerlos inmutables, es decir, establecer los componentes reales e imaginarios en el constructor y no proporciona ningún medio para cambiarlos. ¿Tiene una necesidad específica de modificar instancias de Complex una vez creada? – jjwchoy

Respuesta

10

En 9.1.h, ha omitido una 'a'.

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

El código sigue siendo válida, ya que en Objective-C parte de un selector puede tener ningún nombre, por ejemplo,

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

estos métodos son llamados como

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

y el nombre del selector es naturalmente @selector(initWithControlPoints::::).

Por lo tanto, el compilador interpretará su declaración como

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

ya que no han proporcionado a la aplicación de este método -setReal::, gcc le advertirá sobre

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

Por cierto, si solo quiere un valor complejo pero no necesita que sea una clase Objective-C, hay C99 complex, por ejemplo

#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

Gracias, lo estoy perdiendo. – jag

Cuestiones relacionadas