Objective-C C++ wrapper Incomplete definition of type 错误

Objective-C C++ wrapper Incomplete definition of type error

我正在尝试为现有的 C++ class 编写 Objective-c 包装器。 我在 Click.h 中有 Objective-c header :

#import <Foundation/Fundation.h> 
@class CClick; // forward declaration of C++ class
@interface Click : NSObject
@end

然后我在 Click.mm:

中实现了包装器
#import "CClick.h"// import of C++ 
#import "Click.h" // objc import
@interface Click ()
@property (nonatomic, readonly) CClick *clickInternal;
@end
@implementation Click
... 
- (NSString *) uri
{
const char* uri = self.clickInternal->getUri(); // here I have error with incomplete definition of type 'CClick'

CClick 是我的 C++ class,它只有一些属性和 getter。

当我尝试构建我的项目时,我得到:不完整的类型定义'CClick'

C++中的getUri方法定义Click.h:

#include <string> 
#include <vector>

using namespace std;

namespace MyTest {

class CClick {

public:
    string uri;
    string id;

    string getUri() {
        return uri;
    }

    string getId() {
        return id;
    }
};

}

您似乎忘记将 CClicknamespace MyTest 一起使用。检查我下面的代码。

#import <Foundation/Fundation.h>
namespace MyTest {
class CClick; // forward declaration of C++ class
}
@interface Click : NSObject
@end

实现文件。

@interface Click ()
@property (nonatomic, readonly) MyTest::CClick *clickInternal;
@end

或者简单地添加 using namespace MyTest;

来自@Richard Hodges 的重要提示:

using namespace std; is a very bad idea. Using it in a header file is inviting disaster for yourself and anyone who includes your poisonous header file. You need to stop that right now.

要编写包装器 class,您必须创建一个 .mm class。从您的问题中不清楚您的实现是否嵌套在 .mm class 中。这告诉编译器您的 class 想要访问(或包含)c++ 代码。 (Google Objective-C++)

未经测试的伪示例。 C++ Class Foo 和 Wrapper class Bar.

Objective C Header:

#import <Foundation/Fundation.h>     
@interface Bar : NSObject
+ (NSString *) myString;
@end

Objective C++ 实现:

#include "Foo.h"
@implementation Bar
 + (NSString *) myString{
    return [NSString stringWithUTF8String: Foo::getMyString().c_str()];
}
@end

陷阱:

  • header 不应包含任何 C++ 代码/参考。否则,您将只能将其导入 Objective-C++ classes。
  • 类型转换可能会很痛苦。始终转换原始类型转换。

如何处理 object 关系和生命周期。例如。如果 C++ Object 包含在 Objective-C Object 中,何时删除它是一个不同的主题,但您应该考虑一下 - 这就是我在示例中使用静态调用的原因。