c++ - 使用常量修改重载成员运算符

标签 c++ operator-overloading constants

这是我的问题的概述: 我有一个名为 TWMatrix 的模板类。我已经重载了 () 运算符,以便它可以接受一对 TWMatrix 并提取相应的条目。我希望“提取”为 2 个不同的案例产生 2 个不同的结果。以前在使用一对整数时这已经有效,但我很难让它解决这个稍微不同的问题:

  • 在一种情况下,我希望运算符(operator)将条目复制到另一个 TWMatrix 中并将其输出。
  • 在另一种情况下,我希望运算符将这些条目的地址复制到 TWDataPointer 类型的对象中,并输出该对象。

在第一种情况下,该方法不会破坏常量性。事实上,条目本身既不会被修改,也不会受到 future 修改的影响。在后者中,重点是 TWDataPointer 对象可用于修改矩阵的这些条目。所以相应的代码是:

TWDataPointer<T> operator () (const TWMatrix<int> & I1, const TWMatrix<int> & I2)
{
     return TWDataPointer<T>(*this,I1,I2);
}

TWMatrix<T> operator () (const TWMatrix<int> & I1, const TWMatrix<int> & I2) const 
{
    return SubMat(I1,I2);
}

SubMat 是一种创建具有相应条目的矩阵的方法。它工作得很好,它获取的值在这里并不是很相关。问题是第二个接线员似乎永远不会被调用。例如,如果在我的主要内容中我写:

TWMatrix<double> test = D5(I1,I2);

编译器提示说:

error: conversion from ‘TWDataPointer<double>’ to non-scalar type ‘TWMatrix<double>’ requested

这非常不同:

T operator () (const int & i, const int & j) const 
{
    return data[j+i*nc];
}

T& operator () (const int & i, const int & j) 
{
    return data[j+i*nc];
}

其工作原理与预期完全一致,并根据情况返回 T 或 T&。根据我对重载运算符的理解,const 可以让编译器区分在哪种情况下使用哪个。那么为什么这行不通呢?

提前感谢您的帮助,并随时询问您可能需要的任何额外代码。

PS:我已经想到了一个解决方法,虽然它并不是非常难看,但它远没有我能让它工作起来那么简单、优雅和健壮。

编辑:感谢您迄今为止的帮助,我仍然期待听到您的答案。特别是,我仍然对此感到困惑:

“回到 int 示例,即使 test 没有声明为 const,为什么 a = test(0,0) 也使用相应运算符的 const 版本?事实上,我已经使用 cout 检查过情况确实如此两个版本的 () 运算符中的语句。”

最佳答案

是否有特定原因导致您只需要一个 const第二种方法?从我看来这段代码以及可能的使用场景来看,你的第二种方法在技术上是 const方法,它不必如此声明。换句话说,这是一种 const 都可以使用的方法。和非 const类实例的版本,并且您显然会想到这样的场景:类实例不是 const 时需要该方法。目的。因此,将您的方法标记为 const方法仅仅因为它不会更改调用该方法的实例的状态并不意味着您必须将您的方法标记为 const

为了处理这两种情况,我将生成两个版本的 operator()返回 TWMatrix<T>类型 ... 声明为 const 的类型,以及被声明为非 const 的一个方法,以便双方都可以使用 const和非 const类实例。但缺点是您必须创建一个单独的方法来返回 TWDataPointer<T>类型,因为您不能仅根据返回类型进行重载。

关于c++ - 使用常量修改重载成员运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8491452/

相关文章:

c++ - cppcheck 的规则集

c++ - 为单链栈写一个 operator==

c++ - CreateInstance 返回 "The specified module could not be found."

c - C 编译器 (clang) 如何强制执行 const?

c++ - C++ 头文件中的 const 数组声明

c++ - 使用转换运算符对两个不同类的对象进行相互转换

c++ - 为什么 Prefix Increment Overload 返回的是 Type 而不是 Type?

Java - 创建伪 native 类型

C++:在派生类的对象上调用函数的函数调用优先级规则?

c++ - 函数返回中const T&和T的区别