Iphone 为C++;图书馆

Iphone 为C++;图书馆,iphone,c++,objective-c,xcode,stl,Iphone,C++,Objective C,Xcode,Stl,我试图在Objto-C中编写包装器,这样我就不必在库类之外写C++了。 库主文件是LLAHProcessor.h.cpp 我的包装是LLAHProcessorWrapper.h.mm 它可以很好地编译,但当我将LLAHProcessorWrapper添加到其他类中(比如UIView)作为成员变量时,会出现数百个错误,如: #include <map> : Map no such a file or directory 就像编译器不识别C++代码。 我想知道我在这里错过了什么。 这是

我试图在Objto-C中编写包装器,这样我就不必在库类之外写C++了。 库主文件是
LLAHProcessor.h.cpp

我的包装是
LLAHProcessorWrapper.h.mm

它可以很好地编译,但当我将
LLAHProcessorWrapper
添加到其他类中(比如UIView)作为成员变量时,会出现数百个错误,如:

#include <map> : Map no such a file or directory

就像编译器不识别C++代码。 我想知道我在这里错过了什么。 这是否一定与我将其添加到Xcode目标属性的事实有关:

Other Link Flags : -lstdc++ -lz
或者我需要在这里添加新标志


提前感谢

您需要做的就是像您所做的那样创建一个
.mm
,编译器应该会处理好一切

P> >警告,在C++代码> h > /Cux>文件中有任何C++相关的东西是不安全的,因为它们可以/将由其他Objto-C仅文件导入,然后一切都会崩溃。这里的主要问题是,不能将C++类型直接定义为Objy-C包装器类的实例变量,除非每个“<代码> .m>代码>文件被改名为Objul-C++<代码> .mm < /Cord>file >

解决方案是在头文件中将实例变量定义为
void*
,并使用实现文件中的类型转换访问它们。最简单的解决方案是使用私有属性访问实例变量,该私有属性可以为您创建类型转换

假设代码<代码> Foo是在<代码> Fo.H./C> >:< /P>中定义的C++类

// FooWrapper.h
#import <Foundation/Foundation.h>

@interface FooWrapper : NSObject {
@private
  void* foo;
}
// Actual wrapper API for Foo…
@end


// FooWrapper.mm
#import "FooWrapper.h"
#include <map>
#include "Foo.h"

@interface FooWrapper ()
@property(nonatomic, assign) Foo* foo;
@end

@implementation FooWrapper
-(Foo*)foo {
  return (Foo*)foo;
}
-(void)setFoo:(Foo*)aFoo {
  foo = (void*)aFoo;
}
// Implementation of actual API for Foo…
@end
//FooWrapper.h
#进口
@接口FooWrapper:NSObject{
@私人的
void*foo;
}
//Foo的实际包装器API…
@结束
//Fooowrapper.mm
#导入“FooWrapper.h”
#包括
#包括“Foo.h”
@接口FooWrapper()
@属性(非原子,赋值)Foo*Foo;
@结束
@实现食物包装器
-(Foo*)Foo{
返回(Foo*)Foo;
}
-(无效)setFoo:(Foo*)aFoo{
foo=(void*)aFoo;
}
//实际应用程序接口的实现…
@结束
在要引用
LLAHProcessorWrapper
的任何头文件(
.h
)中,使用前向类定义而不是导入,如下所示:

@class LLAHProcessorWrapper;
@interface SomeView : UIView {
  LLAHProcessorWrapper *wrapper;
}
并确保相应的实现文件具有
#include LLAHProcessorWrapper.h
#import LLAHProcessorWrapper.h


<> >任何实现文件,其中<代码> >包含<代码> >或代码>导入< /COD> >您的头必须有<代码> .mm <代码>作为后缀,如果<代码> LaHPrimor包装器.h < /> >或在整个包含树中的任何其他东西都有任何C++语法。这样,有一个<代码> .mm < /C>文件有一个倾向,意味着代码库的大部分必须重命名为<代码> .mm < /c> >

您的问题是<>代码> m>代码>文件被编译为C而不是C++。因此,当编译器在编译<代码> .M/COD>文件时,即使在头文件中也遇到任何C++,它将被BARF。

毫无疑问,你必须在你的头文件中放置一些C++,因为你的目标C对象包装C++对象,但是有很多方法。一种方法是使用C++对象的指针,并使用方便的预处理器定义“C++”代码,即C++(和ObjuleC++),而不是C(或Objtovi-C),例如

由于您从未在
.mm
文件之外取消引用CPP对象的成员,因此您从未提供结构的完整定义并不重要


您将分别
new
删除
-init
-dealoc
中的指针。您将在LaHPraceRoopRealPr.mm > /COM> ./P>中包含完整C++ C++类声明。code>LLAHProcessor.h
应导入到
.mm
中。文件,不在
.h
文件中。你这么做了吗?项目中也有.m文件?@Chris我有很多.m文件。这是一个相当大的程序。@Ole,好吧,我明白你的意思,但如果我这样做了,我应该如何拥有成员变量?我是否应该在LLAHProcessorWrapper.mm文件中的方法实现之外添加它们?使用
void*
指针作为实例变量。请参阅PeyloW的答案。如果这对任何人都有用:我被困在
#在
LLAHProcessorWrapper.h
中包含“MyCPPClass.h”
。它应该放在
LLAHProcessorWrapper.mm
中。我想我们现在也可以使用类扩展了吧?也许是更好的方法?
@class LLAHProcessorWrapper;
@interface SomeView : UIView {
  LLAHProcessorWrapper *wrapper;
}
// LLAHProcessorWrapper.h

#if defined __cplusplus
class MyCPPClass;    // forward class declaration
#else
typedef struct MyCPPClass MyCPPClass;   // forward struct declaration
#endif

@interface MyOCClass : NSObject
{
@private
    MyCPPClass* cppObject;
} 

// methods and properties

@end