首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C++和operator ->

Objective-C++和operator ->
EN

Stack Overflow用户
提问于 2013-06-05 12:38:27
回答 1查看 253关注 0票数 1

我对operator ->和Objective-C有点问题。

我想在ObjC类上使用C++包装器。

所以我创建了我的类:

代码语言:javascript
复制
@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@end

以及包装器类:

代码语言:javascript
复制
class UserWrapper {
    User *_user;
    //  ctors, accessors, etc.

    operator User *(){
        return _user;
    }

    User *operator->(){
        return _user;
    }
};

当我尝试通过operator User*访问备份对象时,它工作得很好:

代码语言:javascript
复制
UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", [wrapper name]);

但是当我尝试通过operator ->访问这个对象时

代码语言:javascript
复制
UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", wrapper->name);

我有以下错误:

代码语言:javascript
复制
Property 'name' found on object of type 'User *'; did you mean to access it with the "." operator?

似乎我对operator ->的理解是错误的。

有没有人能解释一下我做错了什么,以及如何解决这个问题?

也许还有另一种方法可以直接访问支持对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 13:20:26

在C、C++和Objective-C中,a->b意味着解除对a的引用并访问成员b。在C和C++中,它与(*a).b相同,但比than更简单。

因此,如果User有一个名为name的成员,那么您的->实现将是正确的,但它没有。如果您根本没有编写任何其他代码,那么您的User将有一个名为_name的实例变量、一个setter和一个名为namesetName:的getter。在Objective-C中,这个语法是:

代码语言:javascript
复制
value = object.name;

等同于以下语法:

代码语言:javascript
复制
value = [object name];

即,它被编译为调用getter的方法分派。类似地,这是:

代码语言:javascript
复制
object.name = value;

等同于:

代码语言:javascript
复制
[object setName:value];

即,它被编译为调用setter的方法分派。在这两种情况下,您都不能访问实例变量。在这两种情况下,您都调用setter和getter。如果您想要实现User,您可以不使用支持name的实例变量,而是将其完全放在其他地方,或者将其转换为其他形式。

线索是以下是有效的Objective C语法:

代码语言:javascript
复制
User *object = [[User alloc] init];
object.name;

在C和C++中,点运算符不适用于指针。

在Objective-C中公开直接成员变量访问是不正常的。为了实现正确的包装,您需要为每个属性编写实际的getter和setter。hack方法类似于:

代码语言:javascript
复制
@interface User: NSObject
{
    @public
       NSString *name;
}

@property (nonatomic, copy) NSString *name;
@end

[...]

@implementation User
@synthesize name;
@end

这将:

为属性创建实例变量name;

  • create a setter和
  • ,也称为name;
  • ensure。setter和getter使用property;
  • also的实例变量公开实例变量,以便通过->.

直接访问

然而,直接操作实例变量确实是一个非常糟糕的想法,无论是从设计的角度来看,还是从可维护性的角度来看,都是如此,因为它允许您使用其他Objective-C特性,如键值观察。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16931667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档