代码之家  ›  专栏  ›  技术社区  ›  Robert Karl

将C++方法传递到Objtovi-C方法

  •  2
  • Robert Karl  · 技术社区  · 16 年前

    Expression GraphVC '.

    class Expression {
        double evaluate(double);
    }
    

    我的目标C班:

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

    我想,在函数指针中传递一个双指针并返回一个双指针将是最容易的,而不是C++对象,但是我没有太多的成功。 functional.h . 从Objto-C使用我的C++方法的最佳方法是什么?

    mem_fun this 指针。

    • 编写Objective-C包装器是可能的,但我宁愿使用已经存在的 evaluate() 函数,我不想打破后端和iPhone GUI类之间的清晰分离。
    • 表示 实例。

    <functional>

    4 回复  |  直到 16 年前
        1
  •  2
  •   Logan Capaldo    16 年前

    - (void) plotWithObject:(id)obj
    {
       double result = [obj evaluate: 1.5];
       // ... etc ...
    }
    

    除绘图外:方法。

        2
  •  2
  •   sarnesjo    16 年前

    如果你想在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;
    }
    

    不过,正如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;
    }
    
        3
  •  1
  •   jkp    16 年前

    我认为这里的问题是,您试图传递 Expression 类到Objective-C类。这将不起作用,因为它需要一个 this 指针作为该函数的第一个参数(因此签名与 plot:

    表示 课堂看起来是这样的:

    class Expression {
        static double evaluate(double);
    }
    

    [self plot:myExpression.evaluate(&Express::evalulate)];
    

    正如我所说的,在这方面没有很大的价值,因为你也可以使用标准的C函数(除非你能在C++类中做一些对你有用的东西)。

    我曾经尝试过用objective-c方法连接boost::bind()结果,但没有走多远。我确信如果你在C++运行时挖得足够深,你可以做到。

        4
  •  0
  •   jbrennan    16 年前

    如果C++成员函数返回一个双倍,你的代码不能看起来像这样吗?

    - (void)plot:(double)f;
    

    [self plot:myExpression.evaluate(aDouble)];
    

    或者类似的东西。我没有使用Obj-C和C++的混合,但这就是我要如何处理它的方法。如果这样混合使用Objective-C++文件,您可能还需要在Objective-C++文件上添加.mm扩展名。

        5
  •  0
  •   silicontrip    5 年前

    - (NSValue*)getExpression
    {
        Expression* e = new Expression();
        return [[NSValue alloc] initWithPointer:e];
    }
    
    - (void)callExpression(NSValue*)expression
    {
        Expression* e = [expression pointerValue];
        e->evaluate();
    }