重载operator []以启用元素分配

时间:2013-09-06 05:43:58

标签: c++ operator-overloading thrust

我已经重载了operator []以启用元素访问。

定义

double Matrix::operator[ ](const & int i){
     return data[i]; // data[] is a member array: thrust:: device_vector
}

使用

Matrix m = ... // initialize
std::cout << m[3] << std::endl;

但现在我想通过索引访问元素,以便为其分配新值。

使用

m[3] = 0.;   

我理解运算符重载函数的返回值必须是左值。我想我应该返回一个参考,但不知道这是怎么做的。谢谢!

修改

现在我将我的定义更改为double&amp;,但它仍然抱怨:

 error: initial value of reference to non-const must be an lvalue

数组引用一个thrust :: device_vector,可以通过索引赋值:

Thrust::device_vector<double> M(10);
M[3] = 0.;

4 个答案:

答案 0 :(得分:1)

只需替换

double ....

double& .....

答案 1 :(得分:0)

将您的定义更改为

double& Matrix::operator[ ](const & int i){
     return data[i]; // data[] is a member array
}

答案 2 :(得分:0)

注意,不应该使用引用作为整数参数。它通常用于复杂类以避免复制。我还建议使用m_memberVariable作为旁注,除非你使用pimpl。这是你应该写的:

double& Matrix::operator[ ] (const int i) {
     return m_data[i]; // data[] is a member array
}

注意,您需要添加'&amp;'标记也在声明方法的类头中。

如果您在类标题中有这样的内容,那么这就是全部:

class Matrix
{
private:
    double m_data[100];

public:
    double& operator[] (const int i);
};

Here您可以阅读有关下标运算符重载的更多详细信息。 This是了解更多有关参考资料的另一个网址。

至于一些内联解释为什么它的工作原理如下:

您正在尝试使用左侧的下标运算符进行赋值,因此在您正确表示它时,此类运算符重载的返回值必须是l值。这是因为如果您返回值而不是引用,则使用中的左侧将返回该值,该值将评估为x = 0,其中x替换为1的值。这就是为什么在这种情况下会出现编译错误的原因。

答案 3 :(得分:0)

通常你选择拥有一对运营商。一个用于访问:

double Matrix::operator[ ] const (const & int i){
     return data[i]; 
}

和另一个分配:

double &Matrix::operator[ ](const & int i){
     return data[i]; 
}

如果在const对象上调用[ ] operator,则实际调用第一个运算符。在其他情况下,无论是访问还是分配,第二个都被称为。

你得到错误:

 error: initial value of reference to non-const must be an lvalue

因为data(可能)是一个局部变量。如果它尚未成为Matrix类私有数据成员。