问题标签 [operator-overloading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1910 浏览

python - 如何在 python 中创建一个类支持 __getitem__,但不允许迭代?

我想定义一个支持__getitem__但不允许迭代的类。例如:

我可以在课堂上添加什么B来强制for x in cb:失败?

0 投票
2 回答
1076 浏览

c++ - 这是重载左流运算符的正确方法吗?(C++)

这个函数声明给了我错误:

错误是:

hand 是我做的一个类, display 是 type 的公共数据成员char*

谁能告诉我我做错了什么?

0 投票
1 回答
177 浏览

c# - 我是否需要为 C# 中的强制转换运算符重载提供强制转换方法,以允许人们在 VB 中使用

我在某处读到旧的 VB .net(VB .NET 2005 之前?)不能在 C# 类中使用重载运算符。重载的强制转换运算符是真的吗?

无论哪种方式,你们是否认为 C# 类库不包含它们和算术方法作为其他语言的实际方法是一个缺点,例如:

0 投票
3 回答
3271 浏览

delphi - 你可以重载德尔福记录的赋值运算符吗?

我有一个包含动态数组的记录。通常,当您将一个数组变量分配给另一个数组变量时,实际上只分配了指向该数组的指针。这意味着当您这样做时,两个变量都指向同一个数组,直到您更改其中一个变量的大小。因此,当我想将数组的单独副本分配给变量时,我使用 Copy() 函数。

但是,在这种情况下,我的数组是记录的一个字段:

当我声明两个 TMyRec 类型的变量然后将一个分配给另一个时,两个记录中的“数组”字段将指向内存中的相同地址。

为了解决这类问题,我决定重载赋值运算符,如下所示:

如果这可行,在将 TMyRecord 变量分配给另一个变量之后,我就不必分别复制记录中的所有数组字段。

这是我所做的:

有没有办法让我的运算符重载按我的意愿工作?问题是我试图重载默认赋值运算符。这不可能吗?

0 投票
4 回答
259 浏览

c++ - 智能指针可以选择性地隐藏或重定向对它们包装的对象的函数调用吗?

我正在做一个项目,其中某些对象被引用计数——这是一个与 COM 非常相似的设置。无论如何,我们的项目确实有智能指针,可以减少为这些对象显式调用 Add() 和 Release() 的需要。问题是有时,开发人员仍然使用智能指针调用 Release()。

我正在寻找的是一种从智能指针调用 Release() 创建编译时或运行时错误的方法。编译时间对我来说似乎是不可能的。我以为我有一个运行时解决方案(见下面的代码),但它也不能完全编译。显然,使用 operator->() 后不允许隐式转换。

无论如何,任何人都可以想出一种方法来完成我想要完成的事情吗?

非常感谢您的帮助!

凯文

0 投票
3 回答
4850 浏览

c++ - c++ 重载运算符、赋值、深拷贝和加法

我正在重新阅读我的一些旧大学教科书时正在对运算符重载进行一些探索,我认为我误解了一些东西,所以希望这对一些回答者来说是一个不错的轻松声誉。如果这是重复的,请指出我正确的方向。

我创建了一个简单的计数器类,它(在这个阶段)有一个成员,val(一个 int)。

我已经初始化了其中三个计数器,varOne 到 varThree,并希望第三个计数器是前两个的总和(例如,在下面的代码中 varThree.val 设置为 5)

我已经像这样重载了 operator+:

我已经把它变成了一个非成员函数,并且是 counter 类的一个朋友,这样它就可以访问私有值。

当添加另一个私有成员pVal(指向 int 的指针)时,我的问题就开始了。添加这意味着我不能再进行简单的varThree = varOne复制,因为当 varOne 被销毁时,varThree.pVal 仍将指向同一块内存。

我已经重载operator=如下。

现在,如果我做的事情就像varThree = varOne一切都正确复制,但是尝试这样做varThree = varOne + varTwo会给我以下错误:

看起来好像counter::operator=无法处理来自的返回输出operator+,并且我需要operator=进一步重载以接受operator+返回的类型,但是我没有运气,我开始认为也许我已经做了一些事情根本错误。

0 投票
5 回答
6209 浏览

c++ - 模板类上的二元运算符重载

我最近试图衡量我的运算符重载/模板能力,并作为一个小测试,在下面创建了 Container 类。虽然此代码在 MSVC 2008(显示 11)下编译良好且正常工作,但 MinGW/GCC 和 Comeau 都因operator+过载而窒息。因为我比 MSVC 更信任他们,所以我试图找出我做错了什么。

这是代码:

这是Comeau给出的错误:

我很难让 Comeau/MingGW 打球,所以这就是我求助于你们的地方。我的大脑已经很久没有在 C++ 语法的重压下如此融化了,所以我觉得有点尴尬 ;)。

编辑:消除了初始 Comeau 转储中列出的(不相关的)左值错误。

0 投票
3 回答
424 浏览

.net - F# 和 op_GreaterThan

我最近尝试使用 Microsoft Solver Foundation Services 在 F# 中编写一些东西,在这样做的同时我遇到了一个问题:我必须表达一个 (Term > Term) 条件,在 C# 中可以简单地表示为 t1 > t2 和返回另一个 Term 对象。相反,在 F# 中,我必须调用 Term.op_GreaterThan 才能获得与使用 t1 > t2 会产生布尔值而不是术语相同的结果。
现在我想知道为什么 F# 只选择 op_GreaterThan 如果它产生一个布尔值?当 Term 没有实现 IComparable 时,F# 对 t1 > t2 的解释有什么意义?
请注意,我理解为什么基于结构比较概念在平等和整体平等的情况下做这样的事情,我只是不明白如何将其扩展到“大于”/

0 投票
2 回答
1561 浏览

f# - F# 和运算符重载:(>) 和 (^)

好的,有人可以向我解释为什么 F# 允许您重载 > 和 ^ 运算符,但不允许您使用它们吗?

如果我将我的 F# 代码编译为库并使用 VB 中的这些运算符,它们都可以工作。如果我使用 C# 中的这些运算符,除了 op_Concatenate 之外的所有运算符都可以工作(如预期的那样)。但是 F# 不仅忽略了其中的一些,静态类型检查器甚至都懒得告诉你它打算这样做。

编辑代码示例

0 投票
5 回答
422 浏览

c++ - 运算符可以用作函数吗?(C++)

这类似于我提出的另一个问题,但是,我创建了一个表达式类,其工作方式如下:

其中 GreaterThan 是先前定义的函数。我想知道为什么我不能这样做:

特别是当 > 被重载为

这与 GreaterThan 相同:

返回 bool 并接受两个参数的函数。