我有以下棘手的问题:我已经实现了一个(相当复杂的)类,它以多小波为基础表示数学函数.由于+, - 和*等操作在此上下文中非常自然,因此我为此类实现了重载运算符:
FunctionTree<D> operator+(FunctionTree<D> &inpTree);
FunctionTree<D> operator-(FunctionTree<D> &inpTree);
FunctionTree<D> operator*(FunctionTree<D> &inpTree);
Run Code Online (Sandbox Code Playgroud)
操作员在简单的非链式操作中工作得更好,甚至在链接操作员的某些情况下也是如此.声明如
FunctionTree<3> y = a * b + c;
FunctionTree<3> z = a * b + b;
Run Code Online (Sandbox Code Playgroud)
编译看似工作正常.第一行实际上是正常的,但第二行导致valgrind告诉你关于内存被释放的已释放区域和正在访问的未初始化变量的严峻故事.此外,声明如
FunctionTree<D> y = a + b * c;
Run Code Online (Sandbox Code Playgroud)
甚至不会编译,因为我没有定义(一个模糊的运算符将实际对象,而不是引用作为参数).当然解决方案很明确:所有参数和方法都应该是const,甚至可能返回一个const对象或引用.不幸的是,这是不可能的,因为在操作过程中所涉及的任何物体都是不变的!这可能听起来很奇怪,但这是数学所涉及的不可避免的后果.我可以伪造它,使用const_cast,但代码仍然是错误的!
有没有办法解决这个问题?我目前唯一的解决方案是使返回对象为const,从而有效地禁用操作符链接.
问候,.jonas.
我正在研究一种用C++编写的有点复杂的数学代码.我正在使用(模板化)树结构进行自适应函数表示.由于某些数学属性,我最终会遇到需要从一种节点更改为另一种节点的情况.这需要在存储和性能方面透明地并且以最小的开销发生,因为这些结构用于非常繁重的计算.
具体情况如下:我有一个模板化的抽象基类,它定义了一般的双链节点的一般数学和结构属性.每个节点除了跟踪它的子节点之外,还需要来自它的父节点和顶级Tree类的信息.两个类继承自此类,FunctionNode和GenNode.这些类在存储和功能方面非常不同,并且不应该(至少是公开的)彼此的祖先.因此,我想构建一个这样的树:
Run Code Online (Sandbox Code Playgroud)T N / \ N N / \ G N / \ G G
其中T是树,N是普通的FunctionNode,G是GenNode.问题是N - G转换:N需要有G型子,G是N型父.由于N和G只是堂兄而不是兄弟,我不能将N*转换为G*.G足以知道N是一个BaseNode,但N必须以某种方式以多态方式存储G,以便在遍历树时自动调用正确的虚拟.任何想法如何优雅和有效地解决这个问题将不胜感激!:)当然有人可能会破解这个,但由于这是一个非常基础的代码,我想有一个很好的解决方案.未来可能会有很多此代码的衍生产品.
最好的祝福,
Jonas Juselius
特罗姆瑟大学理论与计算化学中心