【问题标题】:Classes owning their objects拥有其对象的类
【发布时间】:2015-11-22 10:09:04
【问题描述】:

问题: 我知道原点是具有 XYPoint 类型的 Rectangle 类的实例变量。源实例变量有另外两个实例变量 x 和 y。没看清楚,矩形类中的if语句是做什么的?

我相信 if (! origin) 表示如果原点不等于零,那么请执行以下操作...原点是否等于零?如果是,它如何等于零以及如何在 if (!origin) 语句中验证。换句话说, if (! origin) 语句是做什么的?

是否存在原点为零的实例?如果发生这种情况,我的代码将如何响应?我知道如果没有 if 语句 myPoint 对象将不会保留其初始值。

我还想知道为什么我们在矩形类中使用类指令而不是导入。它有什么不同。我还注意到我们没有在矩形的实现中导入 XYPoint 标头。如果有人愿意提供帮助,我将不胜感激。非常感谢提前。

注意:请看我下面的代码。


* XYPoint 类

 #import <Foundation / Foundation.h>

 @interface XYPoint: NSObject

 @property int x, y;

 -(void) setX: (int) Xval andY: (int) yVal;
 @end

 #import "XYPoint.h"

 @implementation  XYPoint

 @synthesize x, y;

 -(void) setX: (int) Xval andY: (int) yVal
  { x = xVal;
    y = yVal;
  }
  @end

* 矩形类

#import <Foundation/Foundation.h>

@class XYPoint;
@interface Rectangle: NSObject

-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
@end

#import "Rectangle.h"

@implementation Rectangle
{ 
 XYPoint *origin
}

 -(void) SetOrigin: (XYPoint *) pt
{
 if (! origin)
 origin = [[XYPoint alloc]init];
 origin.x = pt.x;
 origin.y = pt.y;
}

-(XYPoint *) origin
{
  return origin;
}
@end

Main

#import "Rectangle.h"
#import "XYPoint.h"

int main (int argc, char *argv[])
{
  @autoreleasepool {
  XYPoint *myPoint = [[XYPoint alloc]init];

  [myPoint setX: 100 andY: 200];
  myRect.origin = myPoint;

  NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y); 

  [myPoint setX: 50 andY: 75];

  NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y);
}
@end

Origin at (100, 200)
Origin at (100, 200)

【问题讨论】:

  • 你能解释一下你认为正在发生的事情吗
  • 如果 (!origin) 确实存在t means origin is not equal to zero. Means if origin doest。 Origin 是一个指向 Xpoint 对象的指针,问题是如果 origin 不存在,创建并设置 igual 到 pt,可能为零。
  • @OnikIV 谢谢 Onik IV。但是 origin 存在,因为它是矩形类的实例变量。
  • (您可能想赶上 Objective-C 的开发进度,或查找更新的教程。自 Xcode 4.4 起(在大多数情况下)不需要 @synthesize 语句:useyourloaf.com/blog/…
  • @Wain 我认为 if 语句检查原点是否没有零值,如果没有,则将其初始化为零。我不确定,因为这对我来说没有意义......

标签: objective-c oop object inheritance


【解决方案1】:

定义实例变量会创建一个可用于引用实例的指针。它不会为您创建实例。所以,最初是没有起源的。

if 语句检查源是否存在,如果不存在,则创建一个新的,然后代码从参数中传递的值复制值。

旁白:理想情况下,点类将是不可变的并实现复制,因此您只需复制传递的参数即可,而不是重复创建新实例并更新它们。复制不会在不可变类中执行任何操作(返回自身),并且仅用于支持将来添加可变类。

【讨论】:

    【解决方案2】:

    在声明对象实例变量时,将其设置为 nil,在 C / Objective-C 中为零。

    要使用一个对象,它必须被初始化。这就是if 语句检查和执行的操作

    if (! origin) // alternative syntax if (origin == nil)
      origin = [[XYPoint alloc] init];
    

    意思

    如果对象是nil,则初始化它。如果不跳行。

    当代码中只提到类的类型并且不需要头文件时,使用class 指令而不是import 语句。 如果类是在单独的文件中编写的,则在您的代码中需要 import 语句。

    PS:您的代码中有一些小写/大写拼写错误,并且缺少分号。

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2011-04-18
      • 2021-04-02
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多