Continuing from the previous post. This one will look into a working example for the same. The code used here is pretty trivial. It is organized in the following sets of files. A c++ header file which contains the declaration of a class. A c++ implementation file (.cpp) where the member functions are implemented. An Objective-C++ header file which holds the C wrapper struct & an Objective-C wrapper object. An Objective-C++ implementation file (.mm) which implements the C struct & all the member functions for both the C struct as well as the Objective-C class.
CppStruct.h
#include <string>
class MyObject
{
public:
std::string getName();
void setName(std::string tempName);
MyObject();
private:
std::string name;
};
CppStruct.cpp
#include "CppStruct.h"
#include <string>
#include <iostream>
std::string MyObject::getName()
{
return name;
}
void MyObject::setName(std::string tempName)
{
name = tempName;
}
MyObject::MyObject()
{
name = "NIL";
}
CppStructWrapper.h
struct PersonWrapper;
@interface CppStructWrapper : NSObject
{
struct PersonWrapper *obj;
}
-(void) makeAPerson;
-(void) setName:(NSString *) personName;
-(NSString *) getName;
@end
CppStructWrapper.mm
#import "CppStructWrapper.h"
#include "CppStruct.h"
#include <string>
@implementation CppStructWrapper
struct PersonWrapper
{
MyObject *personObj;
std::string getName();
void setName(std::string tempName);
PersonWrapper();
};
std::string PersonWrapper::getName()
{
return personObj->getName();
}
void PersonWrapper::setName(std::string tempName)
{
personObj->setName(tempName);
}
PersonWrapper::PersonWrapper()
{
personObj = new MyObject;
}
-(id) init
{
self = [super init];
if(self)
{
obj = nil;
}
return self;
}
-(void) makeAPerson
{
obj = new PersonWrapper;
}
-(void) setName:(NSString *) personName
{
std::string temp([personName UTF8String]);
obj->setName(temp);
}
-(NSString *) getName
{
NSString *str = [[NSString alloc] initWithUTF8String:obj->getName().c_str()];
return str;
}
@end
ViewController.m
//this code could be anywhere I have put it inside the ViewController.m within the init message.
#import "ViewController.h"
#import "CppStructWrapper.h"
-(id) init
{
self = [super init];
if(self)
{
CppStructWrapper *obj = [[CppStructWrapper alloc] init];
[obj makeAPerson];
[obj setName:@"ABC"];
NSString *str = [obj getName];
NSLog(@"%@",str);
}
return self;
}