1

我正在尝试学习如何使用 Objective-C 并阅读一些关于将 Objective-C 类包装到 C++ 中的教程。我到了以下几点,一切都编译没有任何错误,但是当我运行程序时,它会导致“分段错误”。

好的,假设我有以下片段,我用它编译:g++ -Wall -pedantic -framework Cocoa -x objective-c++ -o test 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;
}

测试-osx.h

#import <Cocoa/Cocoa.h>

@interface OpenController : NSObject {

}

- (void)doOpen:(id)sender;

@end

测试-osx.m

#import "test-osx.h"
#include <stdio.h>

@implementation OpenController

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

@end
4

1 回答 1

4
[(OpenController*)impl doOpen:impl->wrapped];

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

[impl->wrapped doOpen:…]

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

于 2013-09-22T23:22:52.747 回答