gpt4 book ai didi

c++ - 将 C++ 方法传递给 Objective-C 方法

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:32 25 4
gpt4 key购买 nike

我有一个 C++ 类 ' Expression ' 使用我想在我的 Objective-C 类中使用的方法 ' GraphVC '.

class Expression {
double evaluate(double);
}

还有我的 Objective-C 类:

@implementation GraphVC : UIViewController {
- (void)plot:(double(*)(double))f;
@end

我认为传递接受 double 值并返回 double 值的函数指针最容易,这与 C++ 对象相反,但我使用 functional.h 并没有取得太大成功。 .从 Objective-C 使用我的 C++ 方法的最佳方式是什么?

编辑:感谢您的快速回复。请允许我详细说明一下……我有一个用 C++ 编写的后端,我在其中操作 Expression 类型的对象。有理数、多项式、单项式等的子类。我最初的想法是使用 mem_fun来自 ,但我无法以这种方式编译代码。我在使用 bind1st 绑定(bind) this 时也遇到了问题指针。

  • 编写 Objective-C 包装器是一种可能,但我宁愿使用已经存在的 evaluate()功能,我不想打破后端和 iPhone GUI 类之间的清晰分离。
  • 我不能拥有全局表达式或使用静态方法(我需要绘制任意 Expression 实例。

我应该更明确地说明我需要将 C++ 成员函数(不是静态函数或现有 C 函数)传递给 Objective-C 对象。有没有人有幸使用 C++ 的 <functional>将成员函数转换为我可以在 Objective-C 对象中使用的指针,还是应该使用 Objective-C 包装器?

最佳答案

如果你想在 C++ 中创建一个指向方法的指针,你需要包含类名,像这样:

class Foo
{
public:
double bar(double d)
{
return d;
}
};

void call_using_obj_and_method(Foo *f, double (Foo::*m)(double d))
{
(f->*m)(3.0);
}

int main()
{
Foo f;
call_using_obj_and_method(&f, &Foo::bar);
return 0;
}

请注意,您还需要该类的一个实例。在我的示例中,这是另一个参数,尽管您可以将其设为全局变量或类 Foo 的单例实例。

不过,正如 jkp 所说,您也可以通过将方法设为静态或将其变成常规函数来解决问题。

编辑:我不确定我是否正确理解了您的问题。我不认为你需要使用功能。下面是我的例子在 Objective-C++ 中的样子:

#include <Cocoa/Cocoa.h>

class Foo
{
public:
double bar(double d)
{
return d;
}
};

typedef double (Foo::*fooMethodPtr)(double d);

@interface Baz : NSObject
{
}
- (void)callFooObj:(Foo *)f method:(fooMethodPtr)m;
@end

@implementation Baz
- (void)callFooObj:(Foo *)f method:(fooMethodPtr)m
{
(f->*m)(3.0);
}
@end

int main()
{
Foo f;
Baz *b = [[Baz alloc] init];
[b callFooObj:&f method:&Foo::bar];
return 0;
}

关于c++ - 将 C++ 方法传递给 Objective-C 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1187879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com