c++ - Objective C++ 代码中的合成属性 setter 未调用复制构造函数

标签 c++ objective-c objective-c++

我们都知道 Objective-C++ 的文档是多么稀疏。我在这方面找不到任何东西,但我也发现很难找到合适的明确搜索词。 所以,Stackoverflow 来拯救(我希望)!

我有一个 C++ 类,我在 Objective-C(++) 类中有一个实例(并且我为要调用的构造函数/析构函数启用了项目设置)。

这一切工作正常,直到我尝试通过 @synthesized 属性公开实例。我将其设为 assign 属性(因为 Obj-C 保留计数不适用)。该属性似乎有效,除非我设置实例时我希望涉及复制构造函数。 我实际看到的是创建了一个临时实例(调用了 that 上的复制构造函数)——这都是预料之中的。但 调用了 ivar 实例上的复制构造函数。这些值是“神奇地”设置的。我假设 @synthesized 代码正在执行类似于 memcpy 的操作作为最后一步。这对 C structs 很好,但对 C++ classes 没有太大帮助,因为代码的正确性取决于正确调用的复制构造函数和赋值运算符。

有没有人更深入地研究过这个,让它工作,或者确认不可能在 Obj-C(++) 类中将 C++ 对象作为 ivars 保存,并让 @ 调用复制构造函数合成d 属性 setter ?

(如有必要,我可以发布所有这些的示例代码 - 但即使是最小版本也是一屏左右)。

最佳答案

嗯,如果我没有混淆的话,没有调用复制构造函数是完全合理的。你希望那个ivar被神奇地破坏和复制构造吗?我想这违反了 C++ 的规则。如果合成setter是概念上的

-(void)setFoo:(Foo)foo_{
    foo=foo_;
}

那么应该调用 operator=,而不是复制构造函数。

也就是说operator= 也没有被调用,真可惜(10.6.4,gcc 4.2.1。)!这是示例代码:

#import <Foundation/Foundation.h>

class Foo{
    int a,b;
public:
    Foo():a(0),b(0){NSLog(@"default constructor for %p",this);}
    Foo(const Foo&foo):a(foo.a),b(foo.b){NSLog(@"copy constructor for %p",this);}
    Foo& operator=(const Foo& foo){
    NSLog(@"assignment operator for %p",this);
        a=foo.a;
        b=foo.b;
        return *this;
    }
};

@interface Bar:NSObject {
    Foo foo;
}
@property (assign) Foo foo;
@end

@implementation Bar
@synthesize foo;
@end

int main(){
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    Bar* bar=[[Bar alloc] init];
    Foo foo;
    bar.foo=foo;
    [pool drain];
}

将它保存到 boo.mm 中,我有:

$ g++ -fobjc-call-cxx-cdtors boo.mm -framework Foundation
$ ./a.out
2010-09-04 12:32:06.570 a.out[24352:903] default constructor for 0x10010cdc8
2010-09-04 12:32:06.572 a.out[24352:903] default constructor for 0x7fff5fbff7e0
2010-09-04 12:32:06.573 a.out[24352:903] copy constructor for 0x7fff5fbff7d0
$

现在,我有了上面写的显式 setter 而不是 @synthesize Foo,我正确地有了

$ ./a.out
2010-09-04 12:42:22.206 a.out[24417:903] default constructor for 0x10010cdc8
2010-09-04 12:42:22.209 a.out[24417:903] default constructor for 0x7fff5fbff7e0
2010-09-04 12:42:22.210 a.out[24417:903] copy constructor for 0x7fff5fbff7d0
2010-09-04 12:42:22.210 a.out[24417:903] assignment operator for 0x10010cdc8

生成合成setter的clang源代码是this ,参见 GenerateObjCSetter。在那里,它最终测试是否需要 C++ 赋值运算符。我会说这是一个灰色地带,没有很好的记录,但目前正在实现......

关于c++ - Objective C++ 代码中的合成属性 setter 未调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642979/

相关文章:

c++ - 查找用户输入的几何平均值

C++:vector<string> 到 char**

c++ - 在构造函数中分配共享指针( boost ),单元测试

objective-c - 展平一个 NSArray

objective-c - Actionscript 到 Obj-C/Cocoa : How to represent BitmapData?

c++ - 在 Objective C++ .mm 文件中包含 POCO 头文件会导致 Xcode 6 出现编译错误

时间:2019-03-08 标签:c++overload[]operator

objective-c - 尝试创建 C 函数列表

ios - 在实例化时初始化一个新数组

c++ - 混合 Objective-C 和 C++