混合C++;和Objective-C(Cocoa)导致分割错误 我试图在Objtovi-C学习我的方法,并阅读一些关于将Objtovi-C类封装成C++的教程。我到了下面的一点,在这里所有的东西都编译没有任何错误,但是当我运行程序时,它会导致一个“分段错误”

混合C++;和Objective-C(Cocoa)导致分割错误 我试图在Objtovi-C学习我的方法,并阅读一些关于将Objtovi-C类封装成C++的教程。我到了下面的一点,在这里所有的东西都编译没有任何错误,但是当我运行程序时,它会导致一个“分段错误”,c++,objective-c,macos,cocoa,segmentation-fault,C++,Objective C,Macos,Cocoa,Segmentation Fault,好的,假设我有以下代码片段,我用它编译:g++-Wall-pedantic-framework Cocoa-x objective-c++-o test.mm。我哪里做错了 测试.mm #include <iostream> #import "test-osx.m" struct OpenControllerImpl { OpenController* wrapped; }; class Panel { OpenControllerImpl* impl; pub

好的,假设我有以下代码片段,我用它编译:
g++-Wall-pedantic-framework Cocoa-x objective-c++-o test.mm
。我哪里做错了

测试.mm

#include <iostream>
#import "test-osx.m"

struct OpenControllerImpl
{
    OpenController* wrapped;
};

class Panel {
    OpenControllerImpl* impl;

public:
    Panel() :
        impl(new OpenControllerImpl) {
            impl->wrapped = [[OpenController alloc] init];
        }
    ~Panel() {
        [(OpenController*)impl release];
    }
    void open() {
        [(OpenController*)impl doOpen:impl->wrapped];
    }
};

int main() {
    Panel* openPanel = new Panel();
    openPanel->open();
    return 0;
}
#import "test-osx.h"
#include <stdio.h>

@implementation OpenController

- (void)doOpen:(id)sender {
    printf("here");
}

@end
#包括
#导入“testosx.m”
结构OpenControllerImpl
{
OpenController*包装;
};
班级小组{
OpenControllerImpl*impl;
公众:
面板():
impl(新OpenControllerImpl){
impl->wrapped=[[OpenController alloc]init];
}
~Panel(){
[(OpenController*)impl发布];
}
空开(){
[(OpenController*)impl doOpen:impl->wrapped];
}
};
int main(){
Panel*openPanel=新面板();
openPanel->open();
返回0;
}

测试osx.h

#import <Cocoa/Cocoa.h>

@interface OpenController : NSObject {

}

- (void)doOpen:(id)sender;

@end
#导入
@接口OpenController:NSObject{
}
-(无效)doOpen:(id)发送方;
@结束

测试osx.m

#include <iostream>
#import "test-osx.m"

struct OpenControllerImpl
{
    OpenController* wrapped;
};

class Panel {
    OpenControllerImpl* impl;

public:
    Panel() :
        impl(new OpenControllerImpl) {
            impl->wrapped = [[OpenController alloc] init];
        }
    ~Panel() {
        [(OpenController*)impl release];
    }
    void open() {
        [(OpenController*)impl doOpen:impl->wrapped];
    }
};

int main() {
    Panel* openPanel = new Panel();
    openPanel->open();
    return 0;
}
#import "test-osx.h"
#include <stdio.h>

@implementation OpenController

- (void)doOpen:(id)sender {
    printf("here");
}

@end
#导入“test osx.h”
#包括
@OpenController的实现
-(无效)doOpen:(id)发件人{
printf(“此处”);
}
@结束
您正在将保存Objective-C对象的结构强制转换为对象类型。你必须使用

[impl->wrapped doOpen:…]
您不需要强制转换,因为
impl->wrapped
已经是指向
OpenController
对象类型的指针

您正在将保存Objective-C对象的结构强制转换为对象类型。你必须使用

[impl->wrapped doOpen:…]
您不需要强制转换,因为
impl->wrapped
已经是指向
OpenController
对象类型的指针