Iphone 在目标C、XCode中定义类
我不熟悉Objective C,正在尝试编写一个定义复数的类。代码看起来不错,但当我打印到控制台时,实例变量的值是0 代码如下: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
//
// 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];