Re: Using C++ classes from Objective C
Re: Using C++ classes from Objective C
- Subject: Re: Using C++ classes from Objective C
- From: "Rob Napier" <email@hidden>
- Date: Thu, 20 Mar 2008 13:32:05 -0400
Say you have a C++ object called MyObject in the namespace myapp that you
want to access through your ObjC. What I tend to do is create an ObjC++
object called MyObjectWrapper that owns a myapp::MyObject and presents a
pure ObjC interface to its methods. Users of MyObjectWrapper don't have to
include MyObject.h. The trick is that you need to use void* rather than a
real class type in MyObjectWrapper.h like this:
typedef void* MyObjectPtr
@interterface MyObjectWrapper : NSObject
{
MyObjectPtr myObject;
}
That will get you around having C++ class definitions in your header. For a
large system, hoist Wrapper into a superclass that can handle setting and
releasing its owned object. This is also a good place to put routines to
convert vectors and lists into NSArrays, and other similar handy routines.
I still don't think ObjC++ is the best way to learn Cocoa. As has been
discussed on this list before, the best way to learn Cocoa is in the
language Apple uses and best documents. From there, ObjC++, RubyCocoa, etc
are all useful tools for helping people who already understand ObjC.
-Rob
On Thu, Mar 20, 2008 at 12:40 PM, Jeremy <email@hidden> wrote:
> Thanks for the input guys, I really appreciate the help.
> I do have a lot of C++ code that I would like to use and put behind a
> Cocoa front end, so I think that using Objective C++ classes as wrapper
> classes around my C++ classes is the route I would like to take.
>
> Anyone have an example of such a wrapper class so I can get an idea of
> what is the preferred methodology?
> I'm guessing that you create an Objective C++ class with a member variable
> that is a C++ class and then mirror the methods from the C++ class?
>
> I'm worried that I'll still end up having to import the header file for my
> C++ class in my Objective C source file though, which caused a lot of
> compile errors previously.
>
>
> On Mar 20, 2008, at 12:32 PM, John Stiles wrote:
>
> Without starting a religious war, I have to disagree with this.
>
> ObjC++ is probably a bad idea if you are a novice programmer in general,
> but I think it also has some really good things going for it, and having
> written huge amounts of ObjC++ code, I think it's perfectly straightforward
> to use. It is *by far* your best bet for writing cross-platform code that
> uses a native Cocoa front end.
>
>
> Rob Napier wrote:
>
> On Wed, Mar 19, 2008 at 4:12 PM, Jeremy <email@hidden> <email@hidden> wrote:
>
>
> Hi.
>
> I am just starting to learn Cocoa and would like to use standard C++
> classes from my Objective C/C++ classes.
>
>
> You really don't. You think you do (probably because you know C++),
> but then you enter the crazy messed up world of Objective-C++ and
> discover that you really wish you hadn't. A bit of an overstatement,
> yes, but really I'd recommend against using ObjC++ unless you have
> existing C++ code that you have to bridge to, and then it's best used
> just to wrap the C++ classes so that ObjC can deal with them. Learn
> Cocoa in pure ObjC.
>
> ObjC and C++ have very different models for managing memory, types,
> pointers and well, just about everything. Memory management in
> particular is a real hassle. ObjC++ strips away the safety nets from
> both ObjC and C++ because now you have to track two very different
> ways of managing memory (retain counting versus ref variables for
> instance).
>
>
>
> Is there any known documentation on how to do this, or does anyone
> have any pointers?
>
> I tried creating a new object of my C++ class and calling a method on
> it in a .m file and received a bunch of errors (including new not
> being found).
>
> I then changed my .m file to a .mm file and all of the errors went
> away except for one:
> "cannot find interface declaration for 'MyClass'"
>
>
> This probably means that ObjC expects there to be an ObjC class called
> MyClass (rather than a C++ class called MyClass; they're completely
> unrelated class structures). I suspect that you accidentally put
> "@class MyClass" somewhere rather than "class MyClass", or possibly
> wrote "@interface MyClass" somewhere. Alternately, you failed to put
> "class MyClass" above the declaration of m_pMemberVariable and so the
> compiler assumed MyClass was an ObjC class (this is less likely since
> you should have gotten a compiler error elsewhere for that error).
>
> I strongly recommend naming your ObjC and ObjC++ classes differently.
> I typically name the ObjC++ classes ending in "Wrapper" but that's
> because I only ever use these classes to wrap existing C++ classes
> defined in separate C++-only projects.
>
> Also, make sure that you're working in the right namespace. You may
> need to say "new myNamespace::MyClass" here.
>
> ObjC++ is deep magic. It is not a good place to learn Cocoa. It is a
> useful tool once you know Cocoa and need to integrate it at key points
> with C++.
>
> -Rob
>
> --
Rob Napier -- Software and Security Consulting -- http://robnapier.net
"Those who would give up essential liberty to purchase a little temporary
safety, deserve neither liberty nor safety." -- B. Franklin, Printer
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden