- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想编写使用 C++ 和 Cocoa 框架的应用程序,因为 Apple 不支持 Carbon 64 位。 C++ 在 Linux 和 Windows 上的实现似乎很普通,但在 Mac OS X 上,似乎需要额外的 Apple 特定代码(如 Obj-C 包装器)。 Apple 似乎也在强制开发人员使用 Objective-C 而不是 C++ 编写,尽管我可能是错的。
我正在尝试找到一种在 Mac 上编写代码的方法,该方法易于保持跨平台。必须在 Linux/Windows 上用 C++ 编写代码,然后用 Objective-C 重写大部分代码,效率非常低。
有没有一种方法可以用 C++ 编写 future 支持并在 Xcode 中支持的代码?另外,如果这是可能的,我将如何在 Xcode 中混合 C++ 和 Objective-C?谢谢。
最佳答案
您不能完全用 C++ 编写 Cocoa 应用程序。 Cocoa 的许多核心技术都严重依赖于 Objective-C 的后期绑定(bind)功能,例如键值绑定(bind)、委托(delegate)(Cocoa 风格)和目标 Action 模式。后期绑定(bind)要求非常难以在编译时绑定(bind)的类型化语言(如 C++ⁱ)中实现 Cocoa API。当然,您可以编写一个在 OS X 上运行的纯 C++ 应用程序。它只是不能使用 Cocoa API。
因此,如果您想在其他平台上的 C++ 应用程序和基于 Cocoa 的应用程序之间共享代码,您有两种选择。首先是用C++写模型层,用Cocoa写GUI。这是一些非常大的应用程序使用的常用方法,包括 Mathematica .您的 C++ 代码可以保持不变(您不需要“时髦”的苹果扩展来在 OS X 上编写或编译 C++)。您的 Controller 层可能会使用 Objective-C++(也许是您所指的“时髦”Apple 扩展)。 Objective-C++ 是 C++ 的超集,正如 Objective-C 是 C 的超集一样。在 Objective-C++ 中,您可以进行 objc 风格的消息传递调用(如 [some-objc-object callMethod];
) 来自 C++ 函数。相反,您可以从 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++ 的更多信息 guide . View 层可以是纯 Objective-C。
第二种选择是使用跨平台的 C++ 工具包。 Qt工具包可能符合要求。跨平台工具包通常受到 Mac 用户的鄙视,因为它们没有完全正确地获得所有外观和感觉细节,而 Mac 用户期望 Mac 应用程序的 UI 得到润色。然而,Qt 的表现出人意料地好,并且根据受众和应用程序的使用情况,它可能已经足够好了。此外,您将失去一些 OS X 特定的技术,例如 Core Animation 和一些 QuickTime 功能,尽管在 Qt API 中有近似的替代品。正如您所指出的,Carbon 不会被移植到 64 位。由于 Qt 是在 Carbon API 上实现的,因此 Trolltech/Nokia 不得不将 Qt 移植到 Cocoa API 以使其与 64 位兼容。我的理解是 Qt 的下一个版本(目前在 release candiate 中)完成了这个转换并且在 OS X 上是 64 位兼容的。如果你对集成 C++ 感兴趣,你可能想看看 Qt 4.5 的源代码和 Cocoa API。
ⁱ 有一段时间,Apple 将 Cocoa API 提供给 Java,但该桥需要大量的手动调整,并且无法处理更高级的技术,例如上述键值绑定(bind)。当前,动态类型、运行时绑定(bind)的语言(如 Python、Ruby 等)是编写没有 Objective-C 的 Cocoa 应用程序的唯一真正选择(当然这些桥在底层使用 Objective-C)。
关于c++ - 将 C++ 与 Cocoa 一起使用而不是 Objective-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/525609/
我想要的是能够在输入获得焦点或失去焦点时执行某些操作(两个事件)。 我尝试了以下方法,但这按事件单独工作(单独编码时):仅在焦点上,或仅在失去焦点时。 另外,我希望它尽可能跨平台(包括触摸设备),这是
我分别研究了TableView的Filtering和Pagination。 过滤: this帖子帮助我满足了我的需要 分页: this , this帖子也帮助了我 我想像这样将它们组合在一起: 详情-
我是 TDD 方法的新手,所以我想知道是否有人经历过这种机智可以启发我一点。我想获得一些关于如何一起使用 UML 和 TDD 方法的线索。 我已经习惯了:用 UML 设计 --> 生成骨架类(然后保持
我尝试使用入口点和 cmd 设置 Docker。 FROM debian:stretch RUN apt-get update && \ apt install gnupg ca-certificat
我想要一个 Class 对象,但我想强制它所代表的任何类扩展类 A 并实现接口(interface) B。 我能做到: Class 或者: Class 但我不能两者兼得。有办法做到这一点吗? 最佳答案
我是 Rubymine 的长期用户。 Rubymine 非常适合基于 html 的 Rails 应用程序,但我现在正在做更多的 SPA 客户端工作(例如 javascript/react)。我发现我真
我注意到我使用的某个脚本依赖于原型(prototype)。 (Lightbox 2) 它会与 jQuery 在同一页面上一起工作吗?有没有办法确保它们不冲突? 最佳答案 可以,但你需要采取 speci
我需要对表中显示的数据进行分页并通过 ajax 调用获取它 - 这是我通过使用具有以下配置的 dataTables 插件来完成的 - bServerSide : true; sAjaxSource :
我是 gtk 新手,所以想知道在 C 语言中归档和 gtk 是否可以一起使用?例如,我可以从 .txt 文件中读取,然后在相同的代码中使用 gtk 在标签或其他内容中显示它吗?如果是,怎么办? 谢谢!
有没有人设法得到Bck2Brwsr最近与 Java 8/JavaFX 8 一起工作?有没有兼容的机会?我找不到太多关于它的信息,也没有一个好的起点。使用给定的 Maven archetype我遇到了几
在我的应用程序中,用户通过 openid(与 stackoverflow 相同)登录/注销。 我想通过 oauth 向第三方应用程序开放我的应用程序。 如何创建我的 openid-consumer 应
我在启动和运行 Hibernate 和 Spring 时遇到一些问题。我有一个网络服务器项目,它使用了其他几个具有持久实体的项目。我遇到的问题是,对于存储在 WEB-INF/libs 内的另一个 ja
我有 @ControllerAdvice 类,它处理一组异常。我们还有一些其他异常,这些异常用 @ResponseStatus 注释进行注释。为了结合这两种方法,我们使用博客文章中描述的技术:http
我想在屏幕上使用进度条而不是 progressDialog。 我在我的 XML View 文件中插入了一个进度条,我想让它在加载时显示并在不加载时禁用它。 所以我使用的是可见的,但它发生了,所以其余的
CREATE TABLE `users` ( `id` int(11) AUTO_INCREMENT, `academicdegree` varchar(255),
IN() 中使用的查询返回:1, 2。然而,整个查询返回 0 行,这是不可能的,因为它们存在。我在这里做错了什么? SELECT DISTINCT li.auto_id FROM links
亲们, 我如何在使用 Jade 生成的表单上实现 jQuery 样式?我想做的是美化 表单并使它们可点击。我在 UI 方面很糟糕。期间。 我如何在表单上实现这个可选择的方法? http://jquer
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我可以: auto o1 = new Content; 但不能: std::shared_ptr o1(new Content); std::unique_ptr o1(new Content); 我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!