将对象传递给重载运算符

Posted

技术标签:

【中文标题】将对象传递给重载运算符【英文标题】:Passing an Object to Overloaded Operator 【发布时间】:2012-09-05 15:09:03 【问题描述】:

昨天有人给了我一个程序出错。在 MVS 2010 中工作时,我也发现了问题和替代方法。问题是类的重载插入运算符。它的原型如下……

void matrix :: operator << (matrix&) ;

它是从这样的地方调用的......

matrix m ;
m.operator << (m) ;

我发现编译器不允许发送与调用函数的引用参数相同的对象。但我不明白这背后的原因以及它会产生什么问题。如果有人能解释一下,我将不胜感激。 谢谢。

编辑: 实际发生的是,在调试时,它进入函数内部,在执行main 时出来,进入外部依赖文件dbgdel.cpp 并停在这一行。

 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

【问题讨论】:

写出来的代码没有问题,所以问题一定出在不存在的部分。有什么问题? 您遇到了什么编译器或运行时错误?您编写的代码必须小心处理自引用,而许多程序员不这样做。 你有没有"void matrix :: operator 错误是运行时错误。它把我带到了一个外部依赖文件,我不记得它的名字了。问题出在其他地方,这是一个非常小的程序。只需更改参数类型即可解决此问题。 你很可能想要const 【参考方案1】:

给出的代码在VS2010 SP1 中编译并运行良好。

显示的代码也没有问题,完全合法。声明一个运算符重载然后用运算符&lt;&lt; 调用它有点奇怪,因为你可以很容易地写成m &lt;&lt; m

一些猜测:

您在运算符实现中的某处获取了m 的地址并意外删除了它 您超出了可能存储在运算符实现内部的矩阵中的值数组的边界。 调用代码和被调用代码之间的编译器和链接器假设不匹配。检查您的调用约定、两侧的运行时库版本以及任何其他设置,例如 SECURE_SCL 和 interator 调试。

【讨论】:

我也注释掉了整个实现。还是一样的错误。 @CodingMash - 远射,矩阵定义与调用代码是否在不同的 DLL 中? @CodingMash - 好的,用细齿梳检查 DLL 和 EXE 的项目设置,确保它们调用相同版本的系统库,并具有相同的迭代器调试设置. @CodingMash - 我看到你已经接受了这个答案,这是否意味着不同的编译器或链接器设置是问题?您能否在此处添加一些关于您发现的特定问题的信息(如果需要,请编辑答案)?【参考方案2】:

似乎您的程序告诉您堆已损坏:在某些时候它已经超出了数组的边界或通过已释放的指针或类似的东西写入内存。

这些错误很难追踪,因为您不知道它发生的确切时间,但它很可能发生在错误出现的不同位置。以您的方式使用参考参数没有问题。

这里有很多关于如何检测堆损坏的建议:

Heap corruption under Win32; how to locate?

【讨论】:

【参考方案3】:

在实现operator &lt;&lt; 的方法中确保检查自引用:

void matrix :: operator << (matrix& other) 

  if (this == &other) 
  
    /* special processing */
  
 else
  
    /* regular code */
  

【讨论】:

那是另一回事。我想知道为什么它给我发送相同的对象作为参数时出错。 正如我所说,问题出在实现operator&lt;&lt; 的代码中,它不希望将相同的对象作为参数传递,因此以产生错误的方式操作内部结构.

以上是关于将对象传递给重载运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++之重载运算与类型转换

将对象传递给自定义选民?

重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符

如何将对象传递给 innerHTML (JavaScript) 中的函数?

将对象传递给 UICollectionViewCell

React:将对象传递给状态