2013-06-25 34 views
0
  1. 当我编译这个时,我总是得到零而不是值的任何建议?值为矩形类为零

  2. 这里的代码是关于我创建的一个简单的矩形类。

    #import <Foundation/Foundation.h> 
    
    @interface Rectangle : NSObject { 
         int width; 
         int height; 
    } 
    @property int width, height; 
    -(int) area; 
    -(int) perimeter; 
    -(void) setWH: (int) h: (int) w; 
    
    @end 
    
    
    #import "Rectangle.h" 
    
    @implementation Rectangle 
    @synthesize width, height; 
    -(int) area { 
         width*height; 
    } 
    -(int) perimeter { 
         (width+height)*2; 
    } 
    -(void) setWH:(int)h :(int)w { 
         w = width; 
         h = height; 
    } 
    @end 
    
    
    
    #import <Foundation/Foundation.h> 
    #import "Rectangle.h" 
    
    int main (int argc, const char*argv[]) { 
         @autoreleasepool { 
           Rectangle* r = [[Rectangle alloc]init]; 
    
           [r setWH: 6:8]; 
           NSLog(@"the width of the rectangle is %i and the hieght %i", r.width, r.height); 
           NSLog(@"the area is %i and the perimeter is %i", [r perimeter], [r area]); 
    
        } 
    } 
    

回答

3

你翻转的变量赋值:

-(void) setWH:(int)h :(int)w { 
     w = width; 
     h = height; 
} 

应该

-(void) setWH:(int)h :(int)w { 
     width = w; 
     height = h; 
} 
+1

它确实应该是'setWH:(int)w:(int)h',以便名称顺序对应于参数顺序。 –

+3

或更好' - (void)setWidth:(int)w和Height:(int)h'比setWH更清晰。 – PerfectPixel

+0

哦好的哇我没有看到,谢谢 – user2304873

2

一开始我不知道如何它甚至编译,因为你可以” t不需要self。然后我看到了实例变量。

@interface Rectangle : NSObject { 
     int width; 
     int height; 
} 
@property int width, height; 

不这样做。 在现代Objective-C中,您不必为属性编写实例变量,它们将自动合成(您不需要使用@synthesize)。当然,你可以自由地编写它们(特别是如果你开始学习OBjective-C),但是你最好为实例变量选择其他名称,否则会导致混淆。 一个标准的做法是用一个下划线前面加一个属性名称。

//interface 
@property (nonatomic, assign) int myProperty; 

//implementation 
@synthesize myProperty = _myProperty; //this will synthesize a getter, a setter and an instance variable "_myProperty" 

你应该一般喜欢访问属性而不是实例变量,因为这样一来,你就可以改变属性的实现(getter/setter方法/存储数据的方法),而无需改变一切。 因此对于areaperimeter更好的解决方案是这样的(@ PerfectPixel已经告诉过你return,所以只需注意self)。

-(int) area { 
    return self.width * self.height; 
} 
-(int) perimeter { 
    return (self.width + self.height) * 2; 
} 
+0

我不明白所以基本上我实际上不必输入int宽度或高度,并且@property int宽度和高度是足够的?自我和回报究竟意味着什么? – user2304873

+0

是的,'@ property'声明就足够了。它会自动创建一个getter,setter并创建一个实例变量(在花括号中声明的变量)。一个实例变量将有一个名为“_yourPropertyNameHere”的属性和属性相同的类型。 如果您希望该属性使用另一个实例变量,那么可以使用 '@synthesize propertyName = yourVariableNameHere'来执行此操作。 'self'引用一个对象实例(像C#中的'this',Java或C++)。 'return someValue;'意味着当前函数作为计算结果返回'someValue'。 – FreeNickname

+0

但所有这些问题都非常基本。我建议你阅读一些关于Objective-C的文献。 – FreeNickname