混合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
对象类型的指针