【问题标题】:implementing multiple subscription operators for template matrix (operator())为模板矩阵实现多个订阅运算符(operator())
【发布时间】:2023-03-24 08:38:02
【问题描述】:

我收到了一个练习来实现一个通用的 Matrix 类。 其中一项任务如下:“重载 operator(),它获取参数 (unsigned int, unsigned int) 两次,一次为 const,一次为非 const。”。

现在,经过大量搜索,我明白他们的签名应该是这样的:

    T operator()(unsigned int rows, unsigned int colls) const; //cout << "A" << endl;
    T & operator()(unsigned int rows, unsigned int colls); //cout << "B" << endl;

但是,无论我尝试以哪种方式调用它们,都只会调用第二个:

    int main()
    {
        Matrix<int> mat(2, 3);
        mat(1, 1) = 3;
        int i= (9 + mat(1, 1)) ;
        i = mat(2, 1);
        cout << i << endl;
        if (i == mat(1, 2)) {}
        int j = Matrix<int>(2, 2)(1, 1); //calls constructor and then subscription.
    }

输出将是:

B
B
B
0
B
B

【问题讨论】:

  • 您的代码没有理由调用函数的 CV 限定版本,因为 Matrix 的实例是 const 或右值。将您的 Matrix 变量更改为 const,它将被调用。
  • 试试int x = Matrix&lt;int&gt;(2, 3);
  • @πάντα ῥεῖ 刚刚尝试过,并没有改变任何东西。
  • @Captain Obvlious 我的理解是,重载两次的全部意义在于,一个将用于右值?如果我将变量更改为 const 确实会被调用,但是为什么不使用右值呢?或者我只是没有正确理解任务?

标签: c++ c++11 matrix operator-overloading


【解决方案1】:

请求operator() 对教练很好。宇宙有希望。

这不是一个右值/左值的东西,因为它是常数/非常数。 方法定义末尾的const 声明(编译器将执行并进行合理的级别检查以确保它不会)调用该方法不会更改对象的状态。如果您希望能够在常量对象上调用方法,则绝对有必要。

如果您将以下函数添加到您的测试代码中:

void consttest(Matrix<int> &mat, const Matrix<int> &cmat)
{
    mat(1,1) =4;
    cmat(1,1) =4;
}

然后这样称呼它:

consttest(mat, mat);

你会看到很好的 ol' rvalue/lvalue 东西在起作用。可悲的是,您不会看到您的 const operator() 被调用,因为它不会编译。以自己的方式进行的非常好的测试,该方法可以很好地防止错误,但更有用的功能测试是:

void consttest(Matrix<int> &mat, const Matrix<int> &cmat)
{
    std::cout << mat(1,2) << std::endl;
    std::cout << cmat(1,2) << std::endl;
}

顺便说一下,这里有一个关于左值和右值的很好的聊天:What are rvalues, lvalues, xvalues, glvalues, and prvalues?

【讨论】:

  • 谢谢。接受这个答案已经有几年了:)
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多