Objective-C C++ 包装器 类型错误的不完整定义

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

本文关键字:定义 错误 C++ 包装 类型 Objective-C      更新时间:2023-10-16

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

#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++类,它只有一些属性和获取器。

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

c++ 中 CClick.h 中的 getUri 方法定义:

#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的重要说明:

using namespace std;是一个非常糟糕的主意。在头文件中使用它会给您自己和包含有毒头文件的任何人带来灾难。你现在需要停止它。

要编写 Wrapper 类,您必须创建一个.mm类。从您的问题中不清楚您的实现是否嵌套在 .mm 类中。这会告诉编译器您的类想要访问(或包含(c++ 代码。(谷歌目标-C++(

未经测试的伪示例。C++类 Foo 和包装类栏。

目标 C 标头:

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

目标C++ 执行:

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

陷阱:

  • 标头不应包含任何C++代码/引用。否则,您将只能将其导入到Objective-C++类中。
  • 类型转换可能很痛苦。始终强制转换基元类型转换。

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