Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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的方法 我有一个C++对象,我用Objto-C使用它。我想把C++类从一个视图控制器(回调)传递给一个块,这样当它被执行时,我就在主线程上,并且可以更新UI。我目前有一个类似的系统,在调用函数时使用函数指针和performSelector。我想举一个例子,说明如何设置C++变量以及如何将Objto-C块传递给它,并从C++类调用它。_C++_Objective C_Ios4_Objective C Blocks - Fatal编程技术网

将块传递给C++;目标C的方法 我有一个C++对象,我用Objto-C使用它。我想把C++类从一个视图控制器(回调)传递给一个块,这样当它被执行时,我就在主线程上,并且可以更新UI。我目前有一个类似的系统,在调用函数时使用函数指针和performSelector。我想举一个例子,说明如何设置C++变量以及如何将Objto-C块传递给它,并从C++类调用它。

将块传递给C++;目标C的方法 我有一个C++对象,我用Objto-C使用它。我想把C++类从一个视图控制器(回调)传递给一个块,这样当它被执行时,我就在主线程上,并且可以更新UI。我目前有一个类似的系统,在调用函数时使用函数指针和performSelector。我想举一个例子,说明如何设置C++变量以及如何将Objto-C块传递给它,并从C++类调用它。,c++,objective-c,ios4,objective-c-blocks,C++,Objective C,Ios4,Objective C Blocks,如果这是不可能的,您能想出另一个/更好的解决方案吗?请参阅。声明方法时,请使用类似于以下的语法声明块参数: void theFunction(blockReturnType (^argumentName)(blockArgumentTypes)); 块调用看起来像函数调用,因此上面的theFunction实现只调用块并返回其结果,如下所示: int theFunction(int anArgument, int (^theBlock)(int)) { return theBlock(a

如果这是不可能的,您能想出另一个/更好的解决方案吗?

请参阅。声明方法时,请使用类似于以下的语法声明块参数:

void theFunction(blockReturnType (^argumentName)(blockArgumentTypes));
块调用看起来像函数调用,因此上面的
theFunction
实现只调用块并返回其结果,如下所示:

int theFunction(int anArgument, int (^theBlock)(int)) {
    return theBlock(anArgument);
}

这种语法适用于C、C++和Objul-C.</P> < P>所以你只是不完全熟悉块语法吗?如果是这样的话,如果您已经熟悉函数指针(语法大致相同,但使用

^
声明函数指针[当然,创建闭包是不同的]),那么这里有一个快速的示例,希望它能有意义

您可能想为块类型设置一个typedef,只是为了保存自己一遍又一遍地重复相同的事情,但我提供了使用typedef和将块类型本身放入参数中的示例

#import <Cocoa/Cocoa.h>

// do a typedef for the block
typedef void (^ABlock)(int x, int y);

class Receiver
{
public:
    // block in parameters using typedef
    void doSomething(ABlock block) {
        block(5, 10);
    }

    // block in parameters not using typedef
    void doSomethingToo(void (^block)(int x, int y)) {
        block(5, 10);
    }
};


int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Receiver rcv;
    // pass a block
    rcv.doSomething(^(int x, int y) { NSLog(@"%d %d", x, y); });
    rcv.doSomethingToo(^(int x, int y) { NSLog(@"%d %d", x, y); });

    [pool drain];
    return 0;
}
#导入
//对块执行typedef
类型定义无效(^A锁定)(整数x,整数y);
类接收器
{
公众:
//使用typedef阻塞参数
无效剂量测定(锁定块){
块(5,10);
}
//不使用typedef的参数中的块
void doSomethingToo(void(^block)(int x,int y)){
块(5,10);
}
};
int main(int argc,char const*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
接收机rcv;
//经过一个街区
rcv.doSomething(^(intx,inty){NSLog(@“%d%d”,x,y);});
rcv.doSomethingToo(^(intx,inty){NSLog(@“%d%d”,x,y);});
[泳池排水沟];
返回0;
}

什么使你认为你不能把这个块作为参数传递给C++对象的一个方法?我一直在尝试,只需要把语法去掉,这就是这个问题的全部。我想他是问如何把一个块传递给一个C++函数——而不是一个目标C++函数。为什么创建一个闭包不一样?当我谈到创建一个不同的闭包时,我特别指的是
returntype^(parameters){…}
语法,它不同于常规函数,因为我从未见过有人做过类似
doSomething(void(intx,inty){/*一些东西*/})的事情
传递指向某个对象的函数指针。+1表示typedef提示。这使得函数定义更具可读性。