Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
目标-C++;将值从C+分配给OBj-C属性+;对象 当然,首先,我必须承认这是我第一次使用C++。这件事办妥后,我想继续。问题就这么简单,但有些(奇怪的)扭曲。我试图把C++库包装成Objtovi-C代码。假设C++类名为“MyOrthCype”,它有一个方法“GETString”,它返回另一个类“MySuxIdBype”,它有一个名为“MyString”的方法,它返回一个STD::string,我想把它放入一个名为“Mysstring”的属性NString中,用于我的Obj-C类“MyCype”。_C++_Objective C_Xcode5_Objective C++ - Fatal编程技术网

目标-C++;将值从C+分配给OBj-C属性+;对象 当然,首先,我必须承认这是我第一次使用C++。这件事办妥后,我想继续。问题就这么简单,但有些(奇怪的)扭曲。我试图把C++库包装成Objtovi-C代码。假设C++类名为“MyOrthCype”,它有一个方法“GETString”,它返回另一个类“MySuxIdBype”,它有一个名为“MyString”的方法,它返回一个STD::string,我想把它放入一个名为“Mysstring”的属性NString中,用于我的Obj-C类“MyCype”。

目标-C++;将值从C+分配给OBj-C属性+;对象 当然,首先,我必须承认这是我第一次使用C++。这件事办妥后,我想继续。问题就这么简单,但有些(奇怪的)扭曲。我试图把C++库包装成Objtovi-C代码。假设C++类名为“MyOrthCype”,它有一个方法“GETString”,它返回另一个类“MySuxIdBype”,它有一个名为“MyString”的方法,它返回一个STD::string,我想把它放入一个名为“Mysstring”的属性NString中,用于我的Obj-C类“MyCype”。,c++,objective-c,xcode5,objective-c++,C++,Objective C,Xcode5,Objective C++,这是密码。我跳过了include/imports和“使用名称空间”部分。它们是存在的 MyClass.h @interface Torrent : NSObject { my_class myCls; @property NSString *MyNSString; - (instancetype)initWithHandle:(void*)handle; - (void)setInfo; @end 我的班级 @implementation MyClass @synthesize

这是密码。我跳过了include/imports和“使用名称空间”部分。它们是存在的

MyClass.h

@interface Torrent : NSObject {
    my_class myCls;

@property NSString *MyNSString;

- (instancetype)initWithHandle:(void*)handle;
- (void)setInfo;

@end
我的班级

@implementation MyClass

@synthesize MyNSString;

- (instancetype)initWithHandle:(void*)handle {
    self = [super init];
    if (self) {
        myCls = static_cast<my_class*>(handle);
        if (! myCls->is_valid()) return nil;
        [self setInfo];
    }
    return self;
}
尝试#2

尝试#3

尝试1失败,尝试2和尝试3成功。 我还必须提到,大约有75个这样的值需要每一秒钟更新一次(我在代码中使用NSTimer),因此尝试#2会影响性能#3显然是无用的,但不知何故,它是有效的。我想知道为什么#1失败了,而#3和#2成功了

如果有人能给我一些适度(不太大,也不太小)的Objective-C++代码的链接,我也将不胜感激

编辑: 尝试#1导致EXC#U BAD#U访问代码=1


谢谢。

这是我的猜测,因为我们目前缺少一些相关信息。
您的
get\u string()
方法是否可能返回对
my\u second\u类
实例的引用(可能是常量?
如果是这种情况,那么第一次尝试将失败,因为
mySecCls
是一个本地对象,在函数返回时会被销毁。销毁发生后,
MyNSString
指向堆栈上的某个无效内存位置。第二次尝试之所以有效,是因为没有创建这样的本地(即从类的角度来看是临时的)对象,并且传递的指针指向更持久的
myCls
对象的内容

(我还假设
my_string()
返回一个
const std::string&
而不是
字符串,否则您会遇到与生成的临时变量相同的问题)

如果您想制作类似于“尝试2”,但看起来更像“尝试1”的产品,您可以尝试:

- (void)setInfo {
    const my_second_class& mySecCls = myCls->get_string();
    MyNSString = @(mySecCls.my_string().c_str());
}

但是,这相当于尝试1。

请将代码发布到C++类中,那么,尝试2的性能如何低于1?如果我错了,请纠正我,但我假设更多的调用=更少的性能。因此,object=anotherObject.getObject;property1=object.prop1;property2=object.prop2;优于property1=anotherObject.getObject.prop1;property2=anotherObject.getObject.prop2;你的两个假设都是对的。但是,这仍然不能解释成功的尝试3。另外,如果你能举个例子就更好了。就像我说的,当我说到C++时,我是个白痴。但是,我已经开始读一本书了。希望我能在一周内完成。天啊,我得学C++,不是吗?另外,如果你知道一些好的Objective-C++项目,我可以从中找到这样的例子,我将不胜感激。无论如何,谢谢。尽管行为未定义,但尝试#3很可能会成功(即不会崩溃),因为编译器会优化掉您创建的本地NSString。这只是一个猜测,如果我们忽略了尝试2,我们可以推断错误与MyNSString有关。如果我们忽略了尝试3,我们推断问题在于mySecCls。但是,在这种情况下,我们必须同时考虑这两种情况。我无法决定问题是什么。所谓“工作”,我指的是有正确的行为,而不是“不崩溃”。尝试#3可能不会崩溃,但它也没有任何用处。不,我使用了断点,分配的值是正确的。也许我们应该在聊天时讨论这个问题。它有点太长了,然后贴出正确的答案。
- (void)setInfo {
    MyNSString = @(myCls->get_string().my_string().c_str());
}
- (void)setInfo {
    my_second_class mySecCls = myCls->get_string();
    NSString *unusedString = @(mySecCls.my_string().c_str());
}
- (void)setInfo {
    const my_second_class& mySecCls = myCls->get_string();
    MyNSString = @(mySecCls.my_string().c_str());
}