3

我在使用 const 版本重载 operator() 时遇到问题:

#include <iostream>
#include <vector>
using namespace std;

class Matrix {
public:
    Matrix(int m, int n) { 
        vector<double> tmp(m, 0.0);
        data.resize(n, tmp);
    }
    ~Matrix() { }


    const double & operator()(int ii, int jj) const {
        cout << " - const-version was called - ";
        return data[ii][jj];
    }

    double & operator()(int ii, int jj) {
        cout << " - NONconst-version was called - ";
        if (ii!=1) {
            throw "Error: you may only alter the first row of the matrix.";
        }
        return data[ii][jj];
     }


protected:  
    vector< vector<double> > data;
};

int main() {
try {
    Matrix A(10,10);
    A(1,1) = 8.8;
    cout << "A(1,1)=" << A(1,1) << endl;
    cout << "A(2,2)=" << A(2,2) << endl;
    double tmp = A(3,3);
} catch (const char* c) { cout << c << endl; }
}

这给了我以下输出:

  • 调用了 NONconst-version - - 调用了 NONconst-version - A(1,1)=8.8
  • 调用了 NONconst-version - 错误:您只能更改矩阵的第一行。

如何实现 C++ 调用 operator() 的 const 版本?我正在使用 GCC 4.4.0。

4

5 回答 5

3

重载看起来不错,但你永远不会在 const 对象上调用它。你可以试试这个:

void foo(const Matrix& A) {
  cout << "A(1,1)=" << A(1,1) << endl;
}

Matrix A(10,10);
foo(A);

这给了你:

 - const-version was called - A(1,1)=0
于 2010-03-14T00:40:08.813 回答
2

您调用该方法的对象必须是 const,例如

cout << "A(2,2)=" << (*static_cast<const Matrix*>(&A))(2,2) << endl;
于 2010-03-14T00:32:48.337 回答
1

通常,您不能调用函数的 const 或非 const 版本,具体取决于您对返回值的处理方式。如果您想模拟类似的功能,您可以尝试返回一些代理,该代理将根据您使用它的方式切换行为:

class Proxy
{
  Matrix& m;
  int x, y;
public:
  ...
// mutating operations
  operator double&() { check(); return m.index(x,y); }
  double& operator=(double d) { check(); return m.index(x,y)=d; }
// ... other mutating operations (+=, ...) analogously

// nonmutating ops
  operator double() { return m.const_index(x, y); }
  operator const double&() // ... same
};

Proxy Matrix::operator(int x, int y)
{
  return Proxy(*this, x, y);
}

假设check()是您对合法突变的检查(可以集成在 中index()),index()并且const_index()是 Matrix 中的方法,它们提供对特定位置的引用或 const 引用。

于 2010-03-14T00:54:37.217 回答
0

使用 const_cast<>() 或使您的实例为 const。

我猜也许你想确保操作员返回一个 const double?也许你应该只提供 const 版本,而不是另一个。

于 2010-03-14T00:29:01.363 回答
0

你有不同功能的不同方法,所以给它们不同的名字。那么你不需要一个const对象来调用你想要的。

如果您确实有一个 const 对象,您仍然可以operator() const调用替代函数。但是替代功能应该放在一个具有描述性名称的函数中。

至于获取const对象的句柄,请使用static_cast< const Matrix & >( A ).

于 2010-03-14T03:45:13.453 回答