调用Operator()“函数调用”以返回对数组元素的引用

时间:2013-02-08 15:41:59

标签: c++ functor

我想我并不真正了解推荐背后的内容,我很乐意了解更多相关信息。

我正在编写一个数学“向量”类来进行数值模拟的基本线性代数。在我确信不再使用外部库之前,我正在使用Eigen。我的问题很简单:

  • 我声明了vector并设置了它的3个Scalar类型的组件(这些是双打)。我可以使用我的向量进行数学运算,因为我重载运算符,但这超出了我的问题的范围。
  • 我想通过函数调用operator()访问我对象的第i个组件,因为我使用了Eigen:myVector(0) = 0.0 ;Scalar d = myVector(0)+1.0 ;

根据我对参考文献的理解,这个解决方案应该有效:

class mtnVector {
public:
    typedef double Scalar;
    Scalar  data [3];
    (setters, math, etc...)
    inline Scalar & operator() (const int i) const {
        return data[i] ; 
    }
};

但是g ++说它不喜欢我实现它的方式并且确认我在引用时: Vector.h:185: error: invalid initialization of reference of type ?double&? from expression of type ?const double?

从我的观点来看,非常奇怪的是,如果在类构造中动态设置包含数据的数组(Scalar * data)(使用new运算符),则代码编译良好。但我没有看到动态设置数据持有者的重点。

我既不需要const来重载函数调用操作符,但我接受它。

1 个答案:

答案 0 :(得分:2)

您的operator()已宣布为const。这意味着调用函数永远不应该最终修改对象。该函数通过非const引用返回此对象的成员,这将允许任何调用operator()的人修改对象的内部。显然这很傻,所以编译器不允许这样做。如果您要从const成员函数返回对成员的引用,则需要提供该引用const

inline const Scalar& operator() (const int i) const {
    return data[i] ; 
}

您可能希望同时提供该函数的const和非const版本,其中一个返回const Scalar&,另一个返回Scalar&(这是how the standard library containers do it)。

您想要使用operator()这似乎很奇怪。您的表达式myVector(0)看起来更自然myVector[0],您可以通过重载operator[]来实现这一点。

此外,你应该忽略任何说服你不要使用外部库的人。特别是,Eigen是一个非常成熟且经过全面测试的库。除非你有充分的理由,否则你应该使用它。