代码之家  ›  专栏  ›  技术社区  ›  Patroclus

有可能使C++类成为Objc类的委托吗?

  •  0
  • Patroclus  · 技术社区  · 6 年前

    因为我需要继承C++中声明的一些处理程序作为超类,所以我必须将类声明为 C++ 上课。但我也想让它成为 代表 共两个 Objective-C 上课。在我的C++类中使用委托模式是不可避免的,但是我不知道如何使C++类成为Objtovi-C类的委托。

    有可能吗?还是有间接的方法?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Anatoli P    6 年前

    这里有一个快速而肮脏的例子。

    需要委派给C++的ObjyE-C类的接口和实现

    @interface MyClassOC : NSObject
    @property id<MyDelegateProtocol> myDelegate;
    -(void)doStuff;
    @end
    
    @implementation MyClassOC
    -(void)doStuff {
        if (self.myDelegate) {
            [self.myDelegate performOperation];
        }
    }
    @end
    

    这个 MyDelegateProtocol

    @protocol MyDelegateProtocol
    -(void)performOperation;
    @end
    

    作为委托使用的C++类:

    class MyDelegateCPP {
    public:
        void performOperation();
    };
    
    void MyDelegateCPP::performOperation() {
        cout << "C++ delegate at work!\n";
    }
    

    MyClassOC 不能使用 MyDelegateCPP 因此,我们需要将C++类封装在可以使用C++的对象中,并可以被Objtovi-C类使用。ObjaveC++的解救!

    包装类:

    @interface MyDelegateOCPP : NSObject <MyDelegateProtocol>
    -(void)performOperation;
    @end
    
    // This needs to be in a .mm (Objective-C++) file; create a normal 
    // Objective-C file (.m) and change its extension to .mm, which will 
    // allow you to use C++ code in it.
    @implementation MyDelegateOCPP {
        MyDelegateCPP * delegateCPP;
    }
    -(id)init {
        delegateCPP = new MyDelegateCPP();
        return self;
    }
    -(void)performOperation {
        delegateCPP->performOperation();
    }
    @end
    

    可使用如下:

    MyDelegateOCPP * delegate = [[MyDelegateOCPP alloc] init];
    MyClassOC * classOC = [[MyClassOC alloc] init];
    classOC.myDelegate = delegate;
    [classOC doStuff];
    

    同样,这只是一个过于简单的草图,但希望它能给你一个想法。

        2
  •  1
  •   Jaeda    6 年前

    你需要知道委托是Objtovi.C中的返回数据,所以你用C++语言将类创建为超级类,它将返回数据。
    首先,你使用C++语言来表示C++类,然后添加ObjuleC类,所以C++类和Objc类混合在一个XXX.H/XXX.MM中。

    其次,您还需要委托,您只需在其他objc类中使用objc类实现。

    请参阅测试代码。

    TestViewController.h
    
    #import <UIKit/UIKit.h>
    class testC
    {
       public:
       static int useCMethod();
    };
    
    @protocol helloCDelegate<NSObject>
    @optional
    - (void)testDelegateTransformDataInTest:(int)testNum;
    @end
    @interface TestViewController : UIViewController
    @property (nonatomic,weak) id<helloCDelegate> delegate;
    @end
    
    TestViewController.mm -- section operate implement code
    
    int testC::useCMethod(){
    return 3;
    }
    
    // you can use C++ method and C++ object in sample method.
    // also it use delegate in here,so you can implement in other view controller.
    - (void)tapBackTranformReturnData
    {
       int num = testC::useCMethod();
       [self.delegate testDelegateTransformDataInTest:num];
     }
    

    哦,最重要的是你必须改变 xxx.m 归档到 xxx.mm 这意味着Objto-C++可以使用C++语言和ObjaveC。

    你需要这个功能吗?我希望能帮助你。