将对象参数作为 const 传递并读取它
pass a object parameter as const and read it
这可能是个愚蠢的问题,但我无法解决这个问题。
我有一个名为 equations 的对象,其中定义了一个名为 X 的矩阵。
主要是,我需要调用一个名为 f 的函数,我需要在其中将矩阵作为常量传递。
我需要访问矩阵的特定位置(我不想写,只想读)。
我执行以下操作:
vec f(cx_mat const*X)
{
cout << “X[12][12] = “ << *X(12,12) << endl;
}
而且它不起作用。如果我这样做:
vec f(cx_mat const*X)
{
mat X_temp;
X_temp = *X;
cout << “X[12][12] = “ << X_temp(12,12) << endl;
}
我在工作,但我不明白为什么!!!
你能帮帮我吗?
在你的第二个例子中,你正在创建一个 mat 对象的副本,它不调用 X 的任何非常量方法。这实际上是你问题的一个解决方案,虽然不是很有效 - 我更愿意避免不必要的副本。
所以,很可能,mat class 定义了 operator=(const mat&) 函数。
除了你发现的方法还有其他的可能性:
如果您能够更改 class mat,您可以将 operator() 签名设为常量。这将解决问题。
如果不能更改mat接口,最好将f的签名更改为非常量参数引用,因为不能更改mat接口,您不能真正保证operator()不会'改变 X 的状态。
使用const_cast。我强烈建议不要使用它。我在这里提到它只是为了完整性。
改用 (*X)(12,12)。
函数调用运算符“()”的优先级高于间接运算符“*”。
这可能是个愚蠢的问题,但我无法解决这个问题。
我有一个名为 equations 的对象,其中定义了一个名为 X 的矩阵。
主要是,我需要调用一个名为 f 的函数,我需要在其中将矩阵作为常量传递。 我需要访问矩阵的特定位置(我不想写,只想读)。
我执行以下操作:
vec f(cx_mat const*X)
{
cout << “X[12][12] = “ << *X(12,12) << endl;
}
而且它不起作用。如果我这样做:
vec f(cx_mat const*X)
{
mat X_temp;
X_temp = *X;
cout << “X[12][12] = “ << X_temp(12,12) << endl;
}
我在工作,但我不明白为什么!!! 你能帮帮我吗?
在你的第二个例子中,你正在创建一个 mat 对象的副本,它不调用 X 的任何非常量方法。这实际上是你问题的一个解决方案,虽然不是很有效 - 我更愿意避免不必要的副本。
所以,很可能,mat class 定义了 operator=(const mat&) 函数。
除了你发现的方法还有其他的可能性:
如果您能够更改 class mat,您可以将 operator() 签名设为常量。这将解决问题。
如果不能更改mat接口,最好将f的签名更改为非常量参数引用,因为不能更改mat接口,您不能真正保证operator()不会'改变 X 的状态。
使用const_cast。我强烈建议不要使用它。我在这里提到它只是为了完整性。
改用 (*X)(12,12)。
函数调用运算符“()”的优先级高于间接运算符“*”。