c++ - 使用类别方法在 NSDecimalNumber 上重载算术运算符

标签 c++ ios objective-c xcode objective-c-category

我正在处理一个遗留项目,在这个项目中,最初的开发人员选择用 float 来表示货币值(value)(我知道......)

我们已经按照 this question 的回答中的建议,将处理货币值的项目中的每个变量和属性切换为 NSDecimalNumber。 .

我们遇到的一个小问题是 NSDecimalNumbers 不使用标准算术运算符,而是使用方法。也就是说,当您使用算术运算符时,您添加的是内存地址,而不是实际值。重载算术运算符在 Objective-C 中似乎是不可能的,尽管它可以用 C++。

我认为可以在 NSDecimalNumber 上创建一个用 C++ 编写的类别方法。我知道可以将 C++ 文件添加和编译为 Xcode iOS 项目的一部分,尽管我没有这样做并且不熟悉 C++。

在寻找如何完成此类操作的示例时,我找不到太多。谁能告诉我:

1) 是否可以执行我上面描述的操作?

2) 语法是什么?

最佳答案

我相信您走在正确的轨道上,但可能面临更多问题。首先,正如@UKMonkey 的评论中已经提到的,您可能希望将其更改为一些 typedef ,它曾经是 float 然后更改 typedef 根据需要。

没有理由让你的 typedef 指向一个 NSDecimalNumber。您需要的是对应于某些接口(interface),在您的情况下,该接口(interface)似乎是一些重载的运算符。 也就是说,您可能应该尝试创建一个新的 C++ 类,它将包装 NSDecimalNumber 并拥有自己的重载运算符。

这可以使用非常标准的 C++ 过程来完成,但现在有趣的部分开始了……我不确定嵌入 ARC 支持的对象将如何在 C++ 结构中工作;您放入的只是一个指针,您无法告诉它在分配时应该做什么。因此,您可能需要为这个特定类 ( can be done per file ) 禁用 ARC 并实现将释放您的十进制数的析构函数。

我能想到的下一个问题是,如果您的类公开 C++ 功能,则意味着所有使用/导入此 C++ 类的文件都需要支持 C++,这意味着它们必须重命名为 .mm(或在其上使用 C++ 标志)。

否则,我相信您几乎可以完成此任务,但我会向一些专家级 C++ 开发人员征求对此类的意见,以了解如何最好地重载运算符以及如何正确处理赋值。例如,如果您执行 MyValueType a = anotherMyValueTypeInstance; 是否应该复制内部十进制数或将其重新用作指针...此外,如果可以做任何事情来使用常量,如 MyValueType a = 0; 因为否则你将需要使用函数(如果我没记错的话,C++ 甚至不支持静态方法)所以 MyValueType a = MyValueTypeZero();

至于直接在 Objective-C 中的 NSDecimalNumber 上添加运算符,即使在理论上也是不可能的。问题是您没有使用 NSDecimalNumber 而是使用 NSDecimalNumber * 这意味着您将在指针上重载运算符,而不是在对象本身上。你的编译器告诉你你不能按设计对它们进行算术运算。就 C 而言,求和 2 个指针是完全有效的或写类似的东西:

MyType *buffer = (MyType *)1000; // Not that it makes sense
for(MyType *ptr = buffer; ptr < 1100; ptr++) doSomething(ptr[0]);

关于c++ - 使用类别方法在 NSDecimalNumber 上重载算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48204836/

相关文章:

C++: 为什么基指针和派生指针在 vs2013 中指向同一个地址?

ios - AFNetworking 参数序列化错误

c++ - 如何防止从 char 到 int 的隐式转换?

c++ - boost.python 不支持并行性?

iphone - UITableViewCell 中的多个图像在 iPhone 中附加了操作

ios - 将大型CSV文件加载到核心数据中最快的方法是什么

iPhone 应用程序链接到应用程序商店,但显示空白页面而不是要下载的应用程序

ios - XCode TableViewController 在 Objective-C 中详细介绍

ios - 在 NSTimer 触发之前调用一个函数

c++强制数组声明而不给参数