在我的一个项目中,我正在为std::vector
编写一个包装器。我这样做是因为我使用的是齐次坐标,对于某些操作来说,暂时“忘记”第四个坐标更容易。
现在我偶然发现了一个问题。我有大量的作业,如下所示:
Vector v;
v(0) = 5;
v(1) = 6;
等等。我还想做以下事情:
double x;
x = v(0);
对于最后一件事,我可以重载()运算符,但是如何实现第一件事? (零和一个是索引)。
答案 0 :(得分:5)
只需返回参考。
class Vector
{
int data[4];
int & operator() (int index) { return data[index]; }
};
答案 1 :(得分:1)
返回对要修改的元素的非const引用。
答案 2 :(得分:1)
两件事 -
您可能应该超载operator[]
来执行此操作而不是operator()
,因为这是更自然的操作符。 operator()
用于创建函数对象,而operator[]
是运算符,意思是“在此位置挑选元素。”
您可以通过让函数返回对应写入的值的引用来支持赋值operator[]
/ operator()
的结果。举个简单的例子,这里有一些代表包装原始数组的类的代码:
(代码在这里:)
class Array {
public:
int& operator[] (unsigned index);
int operator[] (unsigned index) const;
private:
int array[137];
};
int& Array::operator[] (unsigned index) {
return array[index];
}
int Array::operator[] (unsigned index) const {
return array[index];
}
这些函数中的第二个是const
重载,因此您可以const Array
读取但不能写入值。
答案 3 :(得分:1)
在标准库中,通过让operator()
(实际上通常是operator[]
)返回类型double &
来实现这些功能。通过返回对double的引用,您可以分配给它或从中分配。
但是,您确定要将其包裹在std::vector
左右吗?这个类不是数学意义上的向量;它很像Java ArrayList
,因此对于小型结构来说效率不高。通常当我编写自己的矢量类时,我正计划在它们周围使用它们,所以我在静态数组之上从头开始实现一个类。