আপনি যদি সাবধানে এটি করেন তবে আপনি সি ++ অবজেক্টিভ-সি এর সাথে মিশতে পারেন। কয়েকটি ক্যাভেট রয়েছে তবে সাধারণভাবে বলতে গেলে এগুলি মিশ্রিত হতে পারে। আপনি যদি এগুলি আলাদা রাখতে চান তবে আপনি একটি স্ট্যান্ডার্ড সি র্যাপার ফাংশন সেটআপ করতে পারেন যা অবজেক্টিভ সি-অবজেক্টটিকে অ-অবজেক্টিভ-সি কোড থেকে ব্যবহারযোগ্য সি-স্টাইল ইন্টারফেস দেয় (আপনার ফাইলগুলির জন্য আরও ভাল নাম বাছাই করুন, আমি এই নামগুলি বেছে নিয়েছি) ভার্বোসিটির জন্য):
MyObject-সি-Interface.h
#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__
// This is the C "trampoline" function that will be used
// to invoke a specific Objective-C method FROM C++
int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter);
#endif
MyObject.h
#import "MyObject-C-Interface.h"
// An Objective-C class that needs to be accessed from C++
@interface MyObject : NSObject
{
int someVar;
}
// The Objective-C member function you want to call from C++
- (int) doSomethingWith:(void *) aParameter;
@end
MyObject.mm
#import "MyObject.h"
@implementation MyObject
// C "trampoline" function to invoke Objective-C method
int MyObjectDoSomethingWith (void *self, void *aParameter)
{
// Call the Objective-C method using Objective-C syntax
return [(id) self doSomethingWith:aParameter];
}
- (int) doSomethingWith:(void *) aParameter
{
// The Objective-C function you wanted to call from C++.
// do work here..
return 21 ; // half of 42
}
@end
MyCPPClass.cpp
#include "MyCPPClass.h"
#include "MyObject-C-Interface.h"
int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter)
{
// To invoke an Objective-C method from C++, use
// the C trampoline function
return MyObjectDoSomethingWith (objectiveCObject, aParameter);
}
মোড়কের ফাংশন প্রয়োজন নেই একই হতে .m
উদ্দেশ্য সি বর্গ হিসাবে ফাইল কিন্তু যে ফাইলটি তাতে কোন অস্তিত্ব নেই চাহিদা উদ্দেশ্য সি কোড হিসেবে সংকলিত করা । মোড়ক ফাংশন ঘোষণা করে এমন শিরোনাম সিপিপি এবং অবজেক্টিভ-সি কোড উভয়ই অন্তর্ভুক্ত করা দরকার।
(দ্রষ্টব্য: যদি উদ্দেশ্য-সি বাস্তবায়ন ফাইলটিকে ".m" এক্সটেনশন দেওয়া হয় তবে এটি এক্সকোডের অধীনে লিঙ্ক করবে না। "। মিমি" এক্সটেনশানটি এক্সকোডকে অবজেক্টিভ-সি এবং সি ++ এর সংমিশ্রণ আশা করতে বলেছে, অবজেক্টিভ-সি ++)। )
আপনি পিআইএমপিএল আইডিয়ামটি ব্যবহার করে উপরের বিষয়টিকে একটি অবজেক্ট-ওরিয়েন্টেন্ট পদ্ধতিতে প্রয়োগ করতে পারেন । বাস্তবায়নটি কিছুটা আলাদা। সংক্ষেপে, আপনি মাইক্লাসের একটি উদাহরণে (প্রাইভেট) শূন্য পয়েন্টার সহ একটি শ্রেণীর ভিতরে মোড়ক ফাংশন ("মাইবজেক্ট-সি-ইন্টারফেস। H" এ ঘোষণা করেছেন) স্থাপন করেন।
মায়োবজেক্ট-সি-ইন্টারফেস। (পিআইএমপিএল)
#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__
class MyClassImpl
{
public:
MyClassImpl ( void );
~MyClassImpl( void );
void init( void );
int doSomethingWith( void * aParameter );
void logMyMessage( char * aCStr );
private:
void * self;
};
#endif
লক্ষ্য করুন যে মোড়কের পদ্ধতিগুলির জন্য আর মাই ক্লাসের উদাহরণের জন্য শূন্য পয়েন্টার প্রয়োজন হয় না; এটি এখন মাইক্লাসআইএমপিএলের ব্যক্তিগত সদস্য। Init পদ্ধতিটি মাইক্লাস উদাহরণটি ইনস্ট্যান্ট করতে ব্যবহৃত হয়;
MyObject.h (পিআইএমপিএল)
#import "MyObject-C-Interface.h"
@interface MyObject : NSObject
{
int someVar;
}
- (int) doSomethingWith:(void *) aParameter;
- (void) logMyMessage:(char *) aCStr;
@end
মায়োবজেক্ট.এমএম (পিআইএমপিএল)
#import "MyObject.h"
@implementation MyObject
MyClassImpl::MyClassImpl( void )
: self( NULL )
{ }
MyClassImpl::~MyClassImpl( void )
{
[(id)self dealloc];
}
void MyClassImpl::init( void )
{
self = [[MyObject alloc] init];
}
int MyClassImpl::doSomethingWith( void *aParameter )
{
return [(id)self doSomethingWith:aParameter];
}
void MyClassImpl::logMyMessage( char *aCStr )
{
[(id)self doLogMessage:aCStr];
}
- (int) doSomethingWith:(void *) aParameter
{
int result;
// ... some code to calculate the result
return result;
}
- (void) logMyMessage:(char *) aCStr
{
NSLog( aCStr );
}
@end
লক্ষ্য করুন যে মাইক্লাস মাইক্লাসআইএমপিএল :: init এ একটি কল দিয়ে ইনস্ট্যান্টেশনযুক্ত। আপনি মাইক্লাসআইএমপিএল এর কনস্ট্রাক্টরে মাইক্লাস ইনস্ট্যান্ট করতে পারেন, তবে এটি সাধারণত ভাল ধারণা নয়। মাই ক্লাস উদাহরণটি মাইক্লাসআইএমপিএল এর ডেস্ট্রাক্টর থেকে ধ্বংস করা হয়েছে। সি-স্টাইল প্রয়োগের মতো, মোড়কের পদ্ধতিগুলি মাইক্লাসের সম্পর্কিত পদ্ধতিগুলিতে কেবল মুলতবি করে।
MyCPPClass.h (পিআইএমপিএল)
#ifndef __MYCPP_CLASS_H__
#define __MYCPP_CLASS_H__
class MyClassImpl;
class MyCPPClass
{
enum { cANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING = 42 };
public:
MyCPPClass ( void );
~MyCPPClass( void );
void init( void );
void doSomethingWithMyClass( void );
private:
MyClassImpl * _impl;
int _myValue;
};
#endif
MyCPPClass.cpp (পিআইএমপিএল)
#include "MyCPPClass.h"
#include "MyObject-C-Interface.h"
MyCPPClass::MyCPPClass( void )
: _impl ( NULL )
{ }
void MyCPPClass::init( void )
{
_impl = new MyClassImpl();
}
MyCPPClass::~MyCPPClass( void )
{
if ( _impl ) { delete _impl; _impl = NULL; }
}
void MyCPPClass::doSomethingWithMyClass( void )
{
int result = _impl->doSomethingWith( _myValue );
if ( result == cANSWER_TO_LIFE_THE_UNIVERSE_AND_EVERYTHING )
{
_impl->logMyMessage( "Hello, Arthur!" );
}
else
{
_impl->logMyMessage( "Don't worry." );
}
}
আপনি এখন মাইক্লাসআইএমপিএলের ব্যক্তিগত প্রয়োগের মাধ্যমে মাই ক্লাসে কলগুলি অ্যাক্সেস করতে পারেন। আপনি যদি কোনও বহনযোগ্য অ্যাপ্লিকেশন বিকাশ করছিলেন তবে এই পদ্ধতির সুবিধাজনক হতে পারে; আপনি অন্য প্ল্যাটফর্মের সাথে নির্দিষ্ট একটি দিয়ে মাইক্লাসের প্রয়োগটি খুব সহজেই বদলাতে পারেন ... তবে সত্যি বলতে কী, এটি আরও ভাল বাস্তবায়ন কিনা আরও স্বাদ এবং প্রয়োজনের বিষয়।