Iphone 在目标C、XCode中定义类

Iphone 在目标C、XCode中定义类,iphone,objective-c,xcode,class,complex-numbers,Iphone,Objective C,Xcode,Class,Complex Numbers,我不熟悉Objective C,正在尝试编写一个定义复数的类。代码看起来不错,但当我打印到控制台时,实例变量的值是0 代码如下: // // ComplexNumber.h // Mandelbrot Set // // Created by Brett on 10-06-02. // Copyright 2010 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> #im

我不熟悉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

但是控制台每次都返回0。帮助?

使用
%f
而不是
%d
。D代表整数,F代表浮点(“实”)。

问题在于您没有分配-(ComplexNumber*)平方法的返回值

创建testNumber时,您可以正确地执行此操作。你有

ComplexNumber *d;

它们应该遵循相同的模式(这是创建对象的新实例的常规模式)

您可能需要定义自定义初始值设定项:-

- (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;与real=a相同。因为不需要->您不应该使用它。如果需要从另一个onject访问变量,可以使用getter和setter方法


哦,是的,正如另一位所指出的。NSLog中的格式说明符也是错误的。

有几件事。在getter/setter中,为什么要使用
self->real
特别是
->
语法。我只看过/用过self.real。你的方法可能有效(?),但惯例是使用peroid。还有,为什么要手动创建geter/seter。除非你需要做更多的逻辑,然后返回并分配给他们,我建议改成这个

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

这不只是输出垃圾值而不是0吗?尝试NSLog(@“%d”,0.0001);你在控制台上没有得到0:)@mustignup,是的@deanWombourne,看情况而定。Double是8字节,int是4字节。该实现将获取实数的前4个字节或最后4个字节,具体取决于参数的传递方式和处理器的endianness。讨论中的4个字节恰好是0,这是非常可行的。@jeremyP感谢您对将testNumber.real转换为int的解释-非常有启发性,但您没有提到testNumber为nil有什么影响?这些字节中的哪一个会产生这种影响?
d.Real中的小写r以符合苹果的指导原则。另外,
self->real
只需直接访问ivar,如果您像Brett那样实现自己的访问器,这是正确的做法。唯一的问题是,
self->
无论如何都是隐含的,所以它只是浪费了击键。i、 e.
real=foo
self->real=foo相同
ComplexNumber *testNumber = [[ComplexNumber alloc] initWithReal:55.0 andImaginary:30.0];
//.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
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];