使用C++;用可可粉代替Objective-C? 我想编写使用C++和COCOA框架的应用程序,因为苹果没有制造碳64位能力。C++在Linux和Windows上的实现似乎很香草,但是在Mac OS X上,似乎需要额外的苹果专用代码(比如Obj-C包装器)。看起来苹果公司正在迫使开发者写在Objto-C而不是C++,虽然我可能是错的。
我正试图找到一种在Mac上编写代码的方法,这样可以很容易地跨平台编写代码。在Linux/Windows中编写C++代码,然后在Objtovi-C中重写大部分内容将是非常低效的。 <>有没有一种方法来编写C++中的代码,将来支持它,XCu码支持呢?另外,如果这是可能的,我将如何在XCODE中混合C++和Objtovi-C?谢谢。 < P>是的,你可以使用C++(即在*.CPP文件中写入),甚至混合C++和Objy-C内*.mm文件(标准Objto-C代码存储在*.m文件)。 当然,你仍然需要使用Objy-C来为用户界面创建C++对象的Objto-C包装器。另一种选择是切换到支持Windows、Mac OS X和Linux的C++框架,并将在下一版本4.5的LGPL下发布。 < P>是的,可以混合它们。 您需要使用Objective-C直接操作GUI对象并接收来自它们的通知 <>这些Objy-C对象可以直接调用C++逻辑,如果将它们放在.mm文件中,而不是纯Objto-C.M文件。请注意,您可能会看到(很多)更老的建议,建议使用大写.M来表示Objective-C++,但这是非常脆弱的,可能会让您和编译器感到困惑 你不需要包装每个C++对象,但是你的ObjuleC代码需要包含指针。 苹果不再发布任何展示如何做到这一点的样本使用C++;用可可粉代替Objective-C? 我想编写使用C++和COCOA框架的应用程序,因为苹果没有制造碳64位能力。C++在Linux和Windows上的实现似乎很香草,但是在Mac OS X上,似乎需要额外的苹果专用代码(比如Obj-C包装器)。看起来苹果公司正在迫使开发者写在Objto-C而不是C++,虽然我可能是错的。,c++,objective-c,cocoa,language-interoperability,C++,Objective C,Cocoa,Language Interoperability,我正试图找到一种在Mac上编写代码的方法,这样可以很容易地跨平台编写代码。在Linux/Windows中编写C++代码,然后在Objtovi-C中重写大部分内容将是非常低效的。 有没有一种方法来编写C++中的代码,将来支持它,XCu码支持呢?另外,如果这是可能的,我将如何在XCODE中混合C++和Objtovi-C?谢谢。 < P>是的,你可以使用C++(即在*.CPP文件中写入),甚至混合C++和Objy-C内*.mm文件(标准Objto-C代码存储在*.m文件)。 当然,你仍然需要使用Obj
<> P> Peter Steinberger在Vistice上的一个很棒的视频强烈推荐任何使用Objto-C++的人,你可以快速浏览记录。 < P>如果你只想使用普通的香草C++,这绝对是支持的,而且与任何其他平台都没有什么不同。XCODE甚至在文件>新项目>命令行实用工具> C++工具下有一个模板。另外,OSX附带了许多流行的开源库(libcurl、libxml2、sqlite等),可用于动态链接。如果你不想,你不必使用可可粉或任何苹果特有的东西
如果你确实想在应用程序的某些部分使用可可粉,请查看。您可以通过将它与.mm扩展,或者右键单击XCODE中的文件并选择GET信息>通用,然后将文件类型更改为SoeCeCoo.cpp.ObjCPP,将C++和ObjuleC混合在同一文件中。第二个选项是有用的,如果你有一个.CPP文件,你想在Mac特定的IFIFF中使用Objto-C。< /P> < P>你不能完全用C++写一个COCOA应用程序。Cocoa的许多核心技术,如键值绑定、委托(Cocoa风格)和目标操作模式,都严重依赖Objective-C的后期绑定功能。后期绑定要求使得很难在编译时绑定的类型化语言中实现COCOA API,如C++。ⁱ. 当然,你可以编写一个运行在OS X上的纯C++应用程序,它不能使用COCa API。
这样,如果您想在其他平台和基于COCOA的应用程序之间共享C++应用程序,您有两种选择。第一个是用C++编写模型层,在COCOA中编写GUI。这是一些非常大型的应用程序常用的方法,包括。你的C++代码可以保持不变(你不需要“时髦”的苹果扩展来编写或编译C++在OS X上)。您的控制器层可能会使用Objective-C++(可能是您提到的“时髦”苹果扩展)。Objor—C++是C++的一个超集,就像ObjuleC是C的超集一样,在ObjuleC++中,可以从C++函数中实现Objc风格的消息传递调用(如<代码> [ObjbObjultCaldMe];)。相反,您可以从Objc代码中调用C++函数,如:
@interface MyClass {
MyCPPClass *cppInstance;
}
@end
@implementation MyClass
- (id)init {
if(self = [super init]) {
cppInstance = new MyCPPClass();
}
return self;
}
- (void) dealloc {
if(cppInstance != NULL) delete cppInstance;
[super dealloc];
}
- (void)callCpp {
cppInstance->SomeMethod();
}
@end
您可以在Objective-C语言中找到有关Objective-C++的更多信息。然后,视图层可以是纯Objective-C
第二种选择是使用跨平台C++工具包。该工具包可能符合要求。Mac用户通常鄙视跨平台工具包,因为它们没有完全正确地获得所有的外观细节,Mac用户希望Mac应用程序的UI更加完美。然而,Qt做得出人意料地好,根据用户和应用程序的使用情况,它可能已经足够好了。此外,您将失去一些特定于OSX的技术,例如核心动画和一些QuickTime功能,尽管QtaPI中有一些近似的替代品。正如您所指出的,Carbon不会被移植到64位。由于Qt是在Carbon API上实现的,Trolltech/Nokia不得不将Qt移植到Cocoa API以使其64位兼容。我的理解是,QT(下一个)的下一个完成此转换,在OS X上是64位兼容的。如果您有兴趣集成C++和COCOA API,您可能需要查看Qt 4.5的源。
ⁱ 有一段时间,苹果公司向Java提供了CocoaAPI,但桥接器需要大量的手动调整,无法处理更高级的技术,如上面描述的键值绑定。目前,动态类型的、运行时绑定的语言(如Python、Ruby等)是编写没有Objto-C的COCOA应用程序的唯一真正选择(当然,这些桥在引擎盖下使用Objtovi-C)。 < P>如果您正在编写纯图形应用程序,即您正在使用代码绘制所有的东西,请考虑。它是一种建立在C/C++之上的开源图形编程语言。是啊哈
/*
* test1.cpp
* This program shows how to access Cocoa GUI from pure C/C++
* and build a truly functional GUI application (although very simple).
*
* Compile using:
* g++ -framework Cocoa -o test1 test1.cpp
*
* that will output 'test1' binary.
*/
#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>
extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg,
CFStringRef strButton1, CFStringRef strButton2,
CFStringRef strButton3, ...);
int main(int argc, char** argv)
{
id app = NULL;
id pool = (id)objc_getClass("NSAutoreleasePool");
if (!pool)
{
std::cerr << "Unable to get NSAutoreleasePool!\nAborting\n";
return -1;
}
pool = objc_msgSend(pool, sel_registerName("alloc"));
if (!pool)
{
std::cerr << "Unable to create NSAutoreleasePool...\nAborting...\n";
return -1;
}
pool = objc_msgSend(pool, sel_registerName("init"));
app = objc_msgSend((id)objc_getClass("NSApplication"),
sel_registerName("sharedApplication"));
NSRunAlertPanel(CFSTR("Testing"),
CFSTR("This is a simple test to display NSAlertPanel."),
CFSTR("OK"), NULL, NULL);
objc_msgSend(pool, sel_registerName("release"));
return 0;
}