我有以下棘手的问题:我已经实现了一个(相当复杂的)类,它在多小波基础上表示数学函数。由于像 +、- 和 * 这样的操作在这种情况下是很自然的,所以我为这个类实现了重载运算符:
FunctionTree<D> operator+(FunctionTree<D> &inpTree);
FunctionTree<D> operator-(FunctionTree<D> &inpTree);
FunctionTree<D> operator*(FunctionTree<D> &inpTree);
这些运算符在简单的非链接操作中工作得更好,甚至在某些情况下链接运算符时。像这样的陈述
FunctionTree<3> y = a * b + c;
FunctionTree<3> z = a * b + b;
编译并且看起来工作正常。第一行实际上没问题,但第二行让 valgrind 告诉你关于在已释放区域内释放内存和访问未初始化变量的可怕故事。此外,像这样的声明
FunctionTree<D> y = a + b * c;
甚至不会编译,因为我还没有定义(一个模棱两可的运算符将一个实际的对象,而不是一个引用作为参数)。当然,解决方案很明确:所有参数和方法都应该设为 const,甚至可能返回一个 const 对象或引用。不幸的是,这是不可能的,因为在操作期间所涉及的对象都不是恒定的!这听起来可能很奇怪,但这是所涉及的数学不可避免的结果。我可以伪造它,使用 const_cast,但代码仍然是错误的!
有没有办法解决这个问题?我目前唯一的解决方案是将返回对象设为 const,从而有效地禁用运算符链接。
问候,.jonas。