假设我有一个指向ICScannerDevice
类类型的指针,我已经为它分配了一些内存。现在,我想用ICScannerDevice
的父类ICDevice
类型的指针初始化它。我该怎么做呢?
下面的方法正确吗?我想不是的!
ICScannerDevice* scannerDevice = [[ICScannerDevice alloc] init];
scannerDevice = (ICScannerDevice*)device; // device is a pointer to ICDevice.
发布于 2016-02-17 02:04:17
假设我有一个指向ICScannerDevice类类型的指针,我已经为它分配了一些内存。
ICScannerDevice* scannerDevice = [ICScannerDevice分配初始化];
你在这里把两样东西混在一起。变量是由声明创建的,声明也可以包含初始化表达式。
当您声明一个变量空间时,分配的变量空间可以包含变量类型的值-无论该类型是int
,在这种情况下,值将是一个整数,例如42
或ICScannerDevice *
,在这种情况下,该值将是对已分配的ICScannerDevice
对象的引用。
所以声明:
ICScannerDevice* scannerDevice
提供存储ICScannerDevice *
类型的值所需的所有空间。您给出的初始化表达式:
[[ICScannerDevice alloc] init];
在您的情况下是多余的(并且是浪费的),您不希望创建ICScannerDevice
类型的对象并在scannerDevice
中存储对该对象的引用,因为您希望在变量中存储完全不同的引用:
现在,我想用ICDevice类型的指针初始化它,这是ICScannerDevice的父类。
scannerDevice = (ICScannerDevice*) device;// device是指向ICDevice的指针。
这是错误的,因为您声明device
持有对ICDevice
对象的引用。因为类型ICDevice
是ICScannerDevice
的父类,所以对ICScannerDevice
的引用可以被视为对ICDevice
的引用-也就是“向上转换”。
然而,已知是ICDevice
类型的对象的引用可能是也可能不是对ICScannerDevice
的引用,例如,对ICPlotterDevice
的引用。所以你不能直接强制转换--也就是“向下转换”和赋值。
You 必须先检查您是否有一个对ICScannerDevice
的引用。为此,您可以使用方法isKindOfObject:
检查被引用对象的类型是否为ICScannerDevice
类型,并使用class
方法获取该类型:
if ( [device isKindOfObject:[ICScannerDevice class]] )
{
// we have a reference to an ICScanner Device
scannerDevice = (ICScannerDevice *)device; // downcast and assign
...
}
else
{
// device references something other than an ICScannerDevice object
// handle this case
...
}
您还需要处理存储在device
中的值为nil
的情况-即它不引用任何内容。您可能只想将其与if
中的测试组合在一起,并将其视为ICScannerDevice
引用:
if ( (device == nil) || [device isKindOfObject:[ICScannerDevice class]] )
或者,您可能需要以其他方式处理它。
HTH
https://stackoverflow.com/questions/35435155
复制相似问题