How to include C++ headers in an Objective C++ header?

15,901

Solution 1

The problem is that you have to avoid all C++ semantics in the header to allow normal Objective-C classes to include it. This can be accomplished using opaque pointers.

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};

ObjCPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end

ObjCPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end

Solution 2

To use C++ in an Objective-C++ header file make sure to:

  1. Have a .h/.mm couple (Objective-C++)
  2. In the identity of your file, have the type set to Objective-C++ Source (it should be automatic)
  3. Include the considered file only from Objective-C++ source files. This point is obvious but can be very quickly forgotten and hard to track down
Share:
15,901
fatfreddyscat
Author by

fatfreddyscat

Updated on June 03, 2022

Comments

  • fatfreddyscat
    fatfreddyscat almost 2 years

    I have a .cpp/.hpp file combo -> the .hpp file has #include ..

    I also have a .mm/.h file combo -> if I include the .hpp file within my .mm Objective C++ file, there are no issues. However, if I try to include the .hpp file within my .h (Objective C header) file, I get a preprocessor issue 'iostream not found'.

    Is there any way around this other than doing funky stuff like having a void* in my Objective C .h file and then casting it as the type that is included in the .mm or wrapping every C++ type within an Objective C++ type?

    My question is basically the same as Tony's question (but nobody answered his):

    https://stackoverflow.com/questions/10163322/how-to-include-c-header-file-in-objective-c-header-file

  • fatfreddyscat
    fatfreddyscat over 11 years
    unfortunately, I can't remove the #include in the .hpp file as it uses certain types in iostream..
  • RonaldBarzell
    RonaldBarzell over 11 years
    Well, here's a thread on this that seems to indicate a work-around: stackoverflow.com/questions/3794931/…
  • fatfreddyscat
    fatfreddyscat over 11 years
    -> thanks for the response but unfortunately that doesn't work for me as I am including my .hpp within the Objective C++ .h file; I tried renaming the .h to .mm and importing that instead but that didn't work. I also tried moving the stuff from the Objective C++ .h file into the .mm file but that didn't work either (and of course wouldn't be helpful in the long run).
  • CodaFi
    CodaFi over 11 years
    You could do what the c people have been doing for years and #ifdef (__cplusplus)
  • fatfreddyscat
    fatfreddyscat over 11 years
    Joe's answer (comment on original question) works best for me: stackoverflow.com/a/2262395/418715
  • fatfreddyscat
    fatfreddyscat over 11 years
    Thanks! You rock! Accepted!
  • ruoho ruotsi
    ruoho ruotsi about 9 years
    This is a great response! Helped me out just now!
  • silicontrip
    silicontrip about 3 years
    I have the problem of objective-c++ header creep. If I have an objective-c++ wrapper class, its header includes C++ headers. And then I wish to use this wrapper object in other objective-c code, I import the wrapper class header which inturn includes the c++. Therefore requiring all my classes to become objective-c++. How do you stop this?