Определение класса в Objective C, XCode - PullRequest
2 голосов
/ 03 июня 2010

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

Вот код:

//
//  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 Delegate для целей отладки я добавил:

- (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. Помощь

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

2 голосов
/ 03 июня 2010

Проблема в том, что вы не выделяете возвращаемое значение вашего метода - (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];

В качестве sidenote:

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

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

0 голосов
/ 03 июня 2010

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

//.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

Позвольте target-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];
...