1

我想我并不真正了解引用背后的内容,我很乐意了解更多关于这些的信息。

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

  • 我声明了向量并设置了它的 3 个类型的组件Scalar(这些是双精度的)。当我重载运算符时,我可以用我的向量做数学运算,但这超出了我的问题范围。
  • 我想通过与 Eigen 一起使用的函数调用运算符 () 访问对象的第 i 个组件: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++ 说它不喜欢我实现它的方式,并在引用处确认我 s***: Vector.h:185: error: invalid initialization of reference of type ?double&? from expression of type ?const double?

从我的角度来看,非常奇怪的是,如果包含数据的数组Scalar * data在类构造时被动态设置()(使用 new 运算符),则代码编译得很好。但我没有看到动态设置数据持有者的意义。

我不需要 const 来重载函数调用运算符,但我接受它。

4

1 回答 1

2

operator()的被宣布const。这意味着调用函数不应该最终修改对象。该函数通过非引用返回该对象的一个​​成员const,这将允许调用operator()者修改该对象的内部。显然这很愚蠢,所以编译器不允许这样做。如果要从const成员函数返回对成员的引用,则需要进行该引用const

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

您可能希望同时提供函数的 aconst和非const版本,其中一个返回 a const Scalar&,另一个返回 a Scalar&(这是标准库容器的做法)。

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

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

于 2013-02-08T15:45:55.453 回答