2010-06-03 1 views
2

Я новичок в Objective C и пытаюсь написать класс, который определяет комплексное число. Код кажется нормально, но когда я печатаю на консоль, мои значения переменных экземпляра равны 0.Определение класса в Objective C, XCode

Вот код:

// 
// ComplexNumber.h 
// Mandelbrot Set 
// 
// Created by Brett on 10-06-02. 
// Copyright 2010 __MyCompanyName__. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import <stdio.h> 


@interface ComplexNumber : NSObject { 

double real; 
double imaginary; 

} 

// Getters 
-(double) real; 
-(double) imaginary; 



// Setters 
-(void)setReal: (double) a andImaginary: (double) b; 

//Function 
-(ComplexNumber *)squared; 

@end 


// 
// ComplexNumber.m 
// Mandelbrot Set 
// 
// Created by Brett on 10-06-02. 
// Copyright 2010 __MyCompanyName__. All rights reserved. 
// 

#import "ComplexNumber.h" 
#import <math.h> 
#import <stdio.h> 

@implementation ComplexNumber 

-(double)real{ 
return self->real; 
} 

-(double)imaginary{ 
return self->imaginary; 
} 


-(void)setReal: (double) a andImaginary: (double) b{ 

self->real=a; 
self->imaginary=b; 

} 

-(ComplexNumber *)squared{ 

double a = pow(real,2); 
double b = pow(imaginary, 2); 
double c = 2*real*imaginary; 

ComplexNumber *d; 
[d setReal:(a-b) andImaginary: c]; 

return d; 
} 

@end 

В App Делегат для отладки Я добавил:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

ComplexNumber *testNumber = [[ComplexNumber alloc] init]; 
[testNumber setReal:55.0 andImaginary:30.0]; 
NSLog(@"%d", testNumber.real); 

    // Override point for customization after app launch  
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

return YES; 
} 

Но консоль возвращает 0 каждый раз. Помогите?

ответ

5

Вместо %d, используйте %f. D - для целых чисел, F - для плавающей запятой («real»).

+0

Хорошо, но проблема здесь – hooleyhoop

+0

Не будет ли это просто выводить значения мусора вместо 0? Попробуйте NSLog (@ "% d", 0.0001); и вы не получите 0 на консоли :) – deanWombourne

+0

@mustISignUp, да, это так. @deanWombourne, это зависит. Двойной - 8 байтов, а int - 4 байта.Реализация будет захватывать либо первые 4 байта, либо последние 4 байта реального числа, в зависимости от того, как передаются аргументы и контенты процессора. Вполне возможно, что 4 байта, о которых идет речь, просто равны 0. – JeremyP

2

Проблема в том, что вы не выделяете возвращаемое значение вашего метода квадратного квадрата (ComplexNumber *).

Вы делаете это правильно при создании testNumber. У вас есть ..

ComplexNumber *d; 

и

ComplexNumber *testNumber = [[ComplexNumber alloc] init]; 

они должны следовать той же схеме (это общий шаблон для создания нового экземпляра объекта).

Вы можете определить собственный инициализатор: -

- (id)initWithReal:(double)a andImaginary:(double)b { 
    self = [super init]; 
    if(self){ 
    real = a; 
    imaginary = b; 
    } 
    return self; 
} 

, а затем вместо

ComplexNumber *testNumber = [[ComplexNumber alloc] init]; 
[testNumber setReal:55.0 andImaginary:30.0]; 

Вы можете использовать

ComplexNumber *testNumber = [[ComplexNumber alloc] initWithReal:55.0 andImaginary:30.0]; 

Как заметка на полях:

само-> реальное = а; совпадает с вещественным = a. Поскольку нет необходимости -> вы не должны его использовать. Если вам нужно получить доступ к переменным из другого объекта onject, вы используете методы getter и setter.

О, да, и как указывалось другое. Спецификатор формата в NSLog также неверен.

+0

Спасибо. Все это отлично поработало! – Brett

-1

Пара вещей. В ваших getters/seters вы используете self->real, а именно синтаксис ->. Я только видел/использовал self.real. Вы можете работать (?), Но конвенция - использовать перороид. Также почему вы вручную создаете geters/seters. Если вам не нужно делать больше логики, тогда просто возвращайтесь и назначайте в них, я предлагаю изменить это.

//.h 
#import <Foundation/Foundation.h> 
#import <stdio.h> 

@interface ComplexNumber : NSObject { 

     double real; 
     double imaginary; 
} 
    @property (nonatomic) double real; 
    @property (nonatomic) double imaginary; 

    //Function 
    -(ComplexNumber *)squared; 
@end 



//.m 
#import "ComplexNumber.h" 
#import <math.h> 
#import <stdio.h> 

@implementation ComplexNumber 

-(ComplexNumber *)squared{ 

double a = pow(real,2); 
double b = pow(imaginary, 2); 
double c = 2*real*imaginary; 

ComplexNumber *d = [[ComplexNumber alloc] init]; 
d.real = a-b; 
d.imaginary = c; 
return d; 
} 

@end 

Позвольте объективу-c создать ваши базовые геттеры/сеттеры для вас по линии @property. Затем вы можете получить доступ/установить их следующими способами.

ComplexNumber *d = [[ComplexNumber alloc] init]; 
d.real = 55; //or 
[d setReal:55]; 
//with reading as easy 
double real = d.real; //or 
double real = [d real]; 
+2

нижний регистр r в 'd.Real;' соответствует требованиям Apple. Также 'self-> real' просто обращается к ivar напрямую, что является правильной вещью, если вы реализуете свои собственные аксессоры, как это делает Бретт. Единственное, что подразумевается в том, что 'self->' подразумевается в любом случае, поэтому он просто отбрасывает нажатия клавиш. то есть 'real = foo;' идентичен 'self-> real = foo;' внутри метода. – JeremyP

+0

В вашем методе квадрата отсутствует alloc/init для результата ... – Eiko

+0

исправил эти проблемы. – jamone

 Смежные вопросы

  • Нет связанных вопросов^_^