从cpp方法调用Objective c方法

时间:2010-08-04 08:44:15

标签: c++ objective-c

我有一个类似的cpp类..

class MyContactListener : public b2ContactListener
{
    int countContact;
    ///this is an objective c class...
    HelloWorld *hel;


        public:
    void EndContact(b2Contact* contact)
    {
            ///initialize objective c object
        hel=[[HelloWorld alloc] autorelease];
            ///call objective c method.........
        [hel beginContact];

    }

 };

在cpp类中我调用一个客观的c方法。目标c方法看起来像..

-(void )beginContact
{ 
    shakeCounter++;
    [_label setString:[NSString stringWithFormat:@"%d",shakeCounter]];


}

客观c方法被调用....并且变量shakeCounter也增加了......但是 _label字符串未更新...._标签已正确初始化并且如果我调用则正常工作 客观c类的客观c方法使用self ....

任何人都可以帮忙???

5 个答案:

答案 0 :(得分:2)

在Contact侦听器中使用Delegate来调用objective-c类上的方法:

class MyContactListener : public b2ContactListener
{
    public:
    MyDelegateClass *delegate;

    void BeginContact(b2Contact* contact) { 
        [delegate beginContact:contact];
    }

    void EndContact(b2Contact* contact) { 
        [delegate endContact:contact];
    }

    void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { 
        [delegate preSolve:contact manifold:oldManifold];
    }

    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)  {  
        [delegate postSolve:contact impulse:impulse];
    }
};

为代表声明一个协议:

#import "Box2D.h"

@protocol B2ContactListener <NSObject>

-(void) beginContact:(b2Contact*) contact; 
-(void) endContact:(b2Contact*) contact;
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold; 
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse; 

@end

声明实现协议的接口:

@interface MyDelegateClass: CCLayer <B2ContactListener> {
  //interface code here. 
}
@end

@implementation MyDelegateClass 

-(void) beginContact:(b2Contact*) contact {
    //implement your code here
} 
-(void) endContact:(b2Contact*) contact {
    //implement your code here
} 
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold{
    //implement your code here
}  
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse{
    //implement your code here
} 
@end

构造委托并在代码中指定委托。将其设置在您的世界对象中:

MyContactListener *listener = new MyContactListener();
listener->delegate = self; 
world_->SetContactListener(listener); 

现在,您的objective-c课程将收到活动。

答案 1 :(得分:0)

oww ....我解决了....

将其放在项目的顶部

#define PTM_RATIO 32
#import "HelloWorldScene.h"

id refToSelf;

并在onload或类似的东西中初始化...

self = [super init];
refToSelf = self;

现在使用此方法调用目标c方法....

    [refToSelf beginContact];

它会起作用............

答案 2 :(得分:0)

我不确定它是否是您问题的根源,但是这一行:

hel=[[HelloWorld alloc] autorelease];

应该是:

hel=[[[HelloWorld alloc] init] autorelease];

答案 3 :(得分:0)

您的代码完全混淆了。我假设你想在endContact中创建Objective-C对象并将其持久化到稍后的某个点。目前,您每次都在创建一个新对象,但您根本没有初始化它。你的代码永远不会起作用。

C ++方法应该类似于:

void EndContact(b2Contact* contact)
{
    // release old object and initialize a new one
    [hel release];
    hel = [[HelloWorld alloc] init];
        ///call objective c method.........
    [hel beginContact];

}

void EndContact(b2Contact* contact)
{
    HelloWorld* hel  = [[HelloWorld alloc] init];
    [hel beginContact];
    [hel release];
}

取决于您希望hel对象持续多长时间。

我不知道为什么_label没有更新。您需要向我们展示您的代码,以便对其进行初始化以解决问题。

答案 4 :(得分:0)

少数事情:

_label是NSString还是NSM​​utableString? NSString不会响应setString,因为它在创建时已得到修复。

这:

self = [super init];
refToSelf = self;

至少可以说是奇怪的。你基本上在这里说self = self。您永远不需要在init上致电self

我强烈建议您在这里查看Apple的精彩介绍:The Objective C Language