Objective-C C++ 包装器 类型错误的不完整定义
Objective-C C++ wrapper Incomplete definition of type error
我正在尝试为现有的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;
}
};
}
好像你忘了用CClick
和namespace 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对象中,则何时删除它是一个不同的主题,但您应该考虑 - 这就是我在示例中使用静态调用的原因。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件