我遇到了使用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版本 - 错误:您只能更改矩阵的第一行。
如何实现C ++调用operator()的const-version?我正在使用GCC 4.4.0。
答案 0 :(得分: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
答案 1 :(得分:2)
您调用方法的对象必须是const,例如
cout << "A(2,2)=" << (*static_cast<const Matrix*>(&A))(2,2) << endl;
答案 2 :(得分: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引用的方法一个特定的地方。
答案 3 :(得分:0)
使用const_cast&lt;&gt;()或使您的实例成为常量。
我猜你也许想确定操作符返回一个const double?也许你应该只提供const版本,而不是另一个版本。
答案 4 :(得分:0)
您有不同的方法和不同的功能,所以给它们不同的名称。然后,您不需要拥有const
对象来调用您想要的内容。
如果发生有一个const对象,你仍然可以让operator() const
调用替代函数。但是替代功能应该放在具有描述性名称的函数中。
至于获取对象的const
句柄,请使用static_cast< const Matrix & >( A )
。