使用C++;用可可粉代替Objective-C? 我想编写使用C++和COCOA框架的应用程序,因为苹果没有制造碳64位能力。C++在Linux和Windows上的实现似乎很香草,但是在Mac OS X上,似乎需要额外的苹果专用代码(比如Obj-C包装器)。看起来苹果公司正在迫使开发者写在Objto-C而不是C++,虽然我可能是错的。

使用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

我正试图找到一种在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代码需要包含指针。 苹果不再发布任何展示如何做到这一点的样本


<> 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;
}