我对operator ->和Objective-C有点问题。
我想在ObjC类上使用C++包装器。
所以我创建了我的类:
@interface User : NSObject
@property (nonatomic, copy) NSString *name;
@end以及包装器类:
class UserWrapper {
User *_user;
// ctors, accessors, etc.
operator User *(){
return _user;
}
User *operator->(){
return _user;
}
};当我尝试通过operator User*访问备份对象时,它工作得很好:
UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", [wrapper name]);但是当我尝试通过operator ->访问这个对象时
UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", wrapper->name);我有以下错误:
Property 'name' found on object of type 'User *'; did you mean to access it with the "." operator?似乎我对operator ->的理解是错误的。
有没有人能解释一下我做错了什么,以及如何解决这个问题?
也许还有另一种方法可以直接访问支持对象?
发布于 2013-06-05 13:20:26
在C、C++和Objective-C中,a->b意味着解除对a的引用并访问成员b。在C和C++中,它与(*a).b相同,但比than更简单。
因此,如果User有一个名为name的成员,那么您的->实现将是正确的,但它没有。如果您根本没有编写任何其他代码,那么您的User将有一个名为_name的实例变量、一个setter和一个名为name和setName:的getter。在Objective-C中,这个语法是:
value = object.name;等同于以下语法:
value = [object name];即,它被编译为调用getter的方法分派。类似地,这是:
object.name = value;等同于:
[object setName:value];即,它被编译为调用setter的方法分派。在这两种情况下,您都不能访问实例变量。在这两种情况下,您都调用setter和getter。如果您想要实现User,您可以不使用支持name的实例变量,而是将其完全放在其他地方,或者将其转换为其他形式。
线索是以下是有效的Objective C语法:
User *object = [[User alloc] init];
object.name;在C和C++中,点运算符不适用于指针。
在Objective-C中公开直接成员变量访问是不正常的。为了实现正确的包装,您需要为每个属性编写实际的getter和setter。hack方法类似于:
@interface User: NSObject
{
@public
NSString *name;
}
@property (nonatomic, copy) NSString *name;
@end
[...]
@implementation User
@synthesize name;
@end这将:
为属性创建实例变量name;
name;->.直接访问
然而,直接操作实例变量确实是一个非常糟糕的想法,无论是从设计的角度来看,还是从可维护性的角度来看,都是如此,因为它允许您使用其他Objective-C特性,如键值观察。
https://stackoverflow.com/questions/16931667
复制相似问题