我想定义一个类myVector,它支持赋值operator=
和括号访问,例如myclass(1) = 0.5
。请参阅下面的虚拟示例
class myVector
{
public:
vector<double> _v;
myVector(unsigned int size) : _v(size, 0) { }
double& operator()(int i)
{
return _v[i];
}
unsigned int size() const { return _v.size(); }
myVector& operator=(const myVector& v)
{
_v.resize(v.size());
for(int i=0;i<v.size();i++)
_v[i] = v(i);
}
}
由于()
未定义为常量函数,因此无法编译此代码。这是因为我想启用myvector(1) = 2
等直接分配。要解决这个问题,我只能想到两个解决方案。一个是定义某事。像double getValue(int i) const
一样,但这似乎很奇怪,因为添加了一些重复的代码。另一种是从const
函数的签名中删除()
,但这也是不合需要的。我相信会有一个很好的工作,但我找不到它。
答案 0 :(得分:2)
正确的解决方案是“两个”。成员函数(包括运算符)可以在const
上重载(this
指针实际上是一个参数并参与重载解析)。
double& operator()(int i) { return _v[i]; }
double operator()(int i) const { return _v[i]; }
注意:对于非成员运算符,左手对象不仅仅是一个参数,它是一个参数。
答案 1 :(得分:0)
对于operator()的特殊情况,您应该只提供两个重载:
double& operator()( int i ) { return _v[i]; }
double operator()( int i ) const { return _v[i]; } // [1]
如果这是一个模板化容器,第二个重载将返回const&
,但鉴于它是double
,返回副本就可以了。
现在作为推荐,您可以实现复制构造函数,然后实现一个简单的swap
函数:
void myVector::swap( myVector & lhs ) {
_v.swap( lhs._v );
}
使用这两个工具,您可以使用operator=
的惯用实现:
myVector& myVector::operator=( myVector rhs ) { // by value
swap( *this, rhs );
return *this;
}
另一件事是,滚动你自己的循环来复制向量是没有意义的,他们已经知道如何自己做,所以_v = v._v;
与你的循环具有相同的效果。